Как инициализировать Сервлет во время запуска с параметрами?

Это зависело бы от того, почему Вы хотите, чтобы это перезапустило себя.

, Если Вы просто ищете способ сделать, чтобы сервис вычистил себя периодически затем, у Вас мог быть таймер, работающий в сервисе, который периодически вызывает стандартную программу чистки.

при поиске способа перезапустить при отказе - сам сервисный хост может обеспечить ту способность, когда это - установка.

Итак, почему необходимо перезапустить сервер? Чего Вы пытаетесь достигнуть?

21
задан BalusC 1 June 2016 в 11:37
поделиться

4 ответа

Можем ли мы написать аргумент конструктор в сервлете?

Да, можно, но это бесполезно, поскольку контейнер сервлета не будет его вызывать.

Правильный способ сделать это - использовать метод init () :

@Override
public void init() throws ServletException {
    String foo = getInitParameter("foo");
    String bar = getServletContext().getInitParameter("bar");
    // ...
}

В этом примере getInitParameter ("foo") возвращает значение конкретной записи в web.xml и getServletContext (). GetInitParameter ("bar") возвращает значение независимого в web.xml .

28
ответ дан 29 November 2019 в 06:34
поделиться

Вы не можете. Сервлет рефлексивно создается контейнером. Если спецификация сервлета допускает аргументы в конструкторе, вам понадобится сложный дескриптор развертывания, например,

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>MyServlet</servlet-class>
    <servlet-argument id="1" type="string">Test<servlet-argument>
    <servlet-argument id="2" type="int">10</servlet-argument>
    <load-on-startup>1</load-on-startup>
</servlet>

Я думаю, что никому это не нужно.

6
ответ дан 29 November 2019 в 06:34
поделиться

Конструкторы - это объекты, управляемые сервером приложений.

Для инициализации см. метод init () .

Обновление:

Могу ли я использовать конструктор в моем сервлете?

A: Сервлет - это обычный класс Java, поэтому, когда нет настраиваемого конструкторы, есть неявный конструктор по умолчанию без аргументов. Контейнеры сервлетов обычно используют Метод Class.newInstance () для загрузки сервлетов, поэтому будьте осторожны добавить явный конструктор по умолчанию, если вы добавляете конструкторы не по умолчанию.

источник: http://www.codestyle.org/java/servlets/FAQ.shtml

5
ответ дан 29 November 2019 в 06:34
поделиться

Проблема может быть сформулирована более обобщенно:

«Согласно спецификации сервлетов (2.3) , сервлеты создаются механизмом сервлетов путем вызова конструктор no-arg. Как я могу правильно инициализировать сервлет , учитывая, что правильная инициализация зависит от центрального / глобального / уникального / приложения {{1} } configuration? "

На самом деле, вы можете использовать сервлеты с конструктором и / или инициализировать их по своему усмотрению. Однако для этого потребуется немного сантехники.

Предположим, у вас есть сервлет с конструктором, имеющим аргументы:

package org.gawi.example.servlets;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class SampleServlet extends HttpServlet
{
    private final String mMessage;

    public SampleServlet(String message)
    {
        mMessage = message;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/plain");
        response.getWriter().write(mMessage);
    }
}

Первое, что вам нужно, это уникальный сервлет внутри вашего приложения, назовем его InitializationServlet, чтобы создать все необходимые экземпляры. Затем эти экземпляры должны быть экспортированы в контекст сервлета для извлечения другим сервлетом (объяснено позже). InitializationServlet может выглядеть так:

package org.gawi.example.servlets;

import javax.servlet.*;
import javax.servlet.http.*;

public class InitializationServlet extends HttpServlet
{
    public void init() throws ServletException
    {
        SampleServlet servletA = new SampleServlet("this is servlet A");
        SampleServlet servletB = new SampleServlet("this is servlet B");
        SampleServlet servletC = new SampleServlet("this is servlet C");

        getServletContext().setAttribute("servletA", servletA);
        getServletContext().setAttribute("servletB", servletB);
        getServletContext().setAttribute("servletC", servletC);
    }
}

Вы видите, что предоставлен только метод init () . Этот сервлет не обслуживает HTTP-запросы. Его единственная цель - сохранить сервлет в ServletContext. Обратите внимание, что вы также могли использовать этот сервлет для загрузки конфигурации вашего приложения. Таким образом, это может действовать как точка входа в веб-приложение, как метод main (String [] args) программы. Это может напомнить вам ContextLoaderServlet SpringSource.

Последней частью является DelegateServlet, который будет эффективно создан контейнером сервлета, только этот сервлет будет перенаправлять все соответствующие вызовы методов в завернутый экземпляр сервлета:

package org.gawi.example.servlets;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class DelegateHttpServlet extends HttpServlet
{
    private static final String SERVLET_CONTEXT_KEY_INIT_PARAMETER = "servletContextKey";

    private HttpServlet mServlet;

    public void init(ServletConfig servletConfig) throws ServletException
    {
        super.init(servletConfig);
        locateServlet(servletConfig);
        mServlet.init(servletConfig);
    }

    private void locateServlet(ServletConfig servletConfig) throws ServletException
    {
        String servletContextAttributeName = servletConfig.getInitParameter(SERVLET_CONTEXT_KEY_INIT_PARAMETER);
        if (servletContextAttributeName == null)
        {
            throw new ServletException("Unable to find init parameter '" + SERVLET_CONTEXT_KEY_INIT_PARAMETER + "'");
        }

        Object object = servletConfig.getServletContext().getAttribute(servletContextAttributeName);

        if (object == null)
        {
            throw new ServletException("Unable to find " + servletContextAttributeName + " in servlet context.");
        }

        if (!(object instanceof HttpServlet))
        {
            throw new ServletException("Object is not an instance of"
                                       + HttpServlet.class.getName()
                                       + ".  Class is "
                                       + object.getClass().getName()
                                       + ".");
        }

        mServlet = (HttpServlet) object;
    }

    public void destroy()
    {
        mServlet.destroy();
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
    {
        mServlet.service(req, res);
    }

}

Во время своей инициализации DelegateServlet будет искать цель сервлет в контексте сервлета с использованием начального аргумента сервлета servletContextKey .

Web.xml для такого приложения может выглядеть так:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <display-name>Example</display-name>
  <description>Example web showing handling of servlets w/ constructors.</description>


  <servlet>
    <servlet-name>Initialization</servlet-name>
    <servlet-class>org.gawi.example.servlets.InitializationServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>A</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletA</param-value>
    </init-param>

    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>B</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletB</param-value>
    </init-param>

    <load-on-startup>3</load-on-startup>
  </servlet>

  <servlet>
    <servlet-name>C</servlet-name>
    <servlet-class>org.gawi.example.servlets.DelegateHttpServlet</servlet-class>

    <init-param>
      <param-name>servletContextKey</param-name>
      <param-value>servletC</param-value>
    </init-param>

    <load-on-startup>4</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>A</servlet-name>
    <url-pattern>/servlet/a</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>B</servlet-name>
    <url-pattern>/servlet/b</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>C</servlet-name>
    <url-pattern>/servlet/c</url-pattern>
  </servlet-mapping>

  <session-config>
    <session-timeout>5</session-timeout>
  </session-config>
</web-app>

Обязательно сначала загрузите InitializationServlet, используя низкое значение .

Преимущество этого подхода заключается в том, что с объектами HttpServlet можно работать, как с любыми другими обычными объектами или компонентами Java. Следовательно, он обеспечивает лучший контроль над инициализацией: больше не нужно делать никаких сложных вещей в методе init () , а также беспорядочной обработки аргументов init-arg сервлета.

24
ответ дан 29 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: