Можно ли использовать загрузку при запуске в web.xml для загрузки произвольного класса при запуске?

Как я могу загрузить произвольный класс при запуске в Tomcat? Я видел тег load-on-startup для файла web.xml, но могу ли я его использовать и как реализовать свой класс?

<servlet-name>??</servlet-name>
<servlet-class>??</servlet-class>
<load-on-startup>10</load-on-startup>

person enfix    schedule 20.07.2010    source источник


Ответы (4)


arrow_upward
31
arrow_downward

Они предназначены для указания порядка загрузки сервлетов. Тем не менее, сервлеты больше предназначены для управления, предварительной обработки и/или постобработки HTTP-запросов/ответов, в то время как вы, похоже, больше ищете ловушку при запуске веб-приложения. В этом случае вам скорее нужен ServletContextListener.

@WebListener
public class Config implements ServletContextListener {
    public void contextInitialized(ServletContextEvent event) {
        // Do your thing during webapp's startup.
    }
    public void contextDestroyed(ServletContextEvent event) {
        // Do your thing during webapp's shutdown.
    }
}

Если вы еще не используете Servlet 3.0 (и, следовательно, не можете использовать @WebListener), вам необходимо вручную зарегистрировать его в web.xml следующим образом:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

Смотрите также:

person BalusC    schedule 20.07.2010
comment
Если я хочу запустить свое приложение с определенным сервлетом (который не может быть статической страницей), это единственный способ? Я бы использовал ваш ContextListener с форвардом? - person lony; 24.05.2012

arrow_upward
8
arrow_downward

Элемент 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 сервлета, оба сервлета будут загружены во время развертывания проекта или запуска сервера. Но сначала будет загружен сервлет1, а затем сервлет2.

Передача отрицательного значения. Если вы передаете отрицательное значение, сервлет будет загружен во время запроса, при первом запросе.

person Jaimin Patel    schedule 25.04.2016

arrow_upward
3
arrow_downward

закрепить,

Ваш XML выглядит хорошо.

Вы должны поместить метод init() в свой класс сервлета, который вызывается при загрузке вашего сервера. Методы doGet, doPost и do вызываются только при наличии входящего запроса.

public class YourServlet extends HttpServlet
{
    public void init()
    {
        //initialize( or add a log statement to debug)
    }
}
person Isaq    schedule 29.07.2013
comment
Это лучший ответ здесь, потому что с целым числом загрузки при запуске вы можете контролировать это, например. ваш сервлет запускается после всех других сервлетов с загрузкой при запуске. Если вам все равно, следует использовать ServletContextListener, который запускается перед всеми этими запускаемыми сервлетами. - person koem; 11.08.2015

arrow_upward
1
arrow_downward

Это решение для Tomcat 7.0. Шаг 1: Создайте военный файл для вашего веб-приложения/сервлета. Если вы используете 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. Ваши сервлеты будут запущены автоматически. Надеюсь это поможет.

person Priyank Desai    schedule 29.07.2013