Для чего используется метод сервлета init ()? - PullRequest
18 голосов
/ 28 февраля 2011

Когда я декомпилирую GenericServlet и проверяю init (), я вижу следующий код:

public void init(ServletConfig servletconfig)
    throws ServletException
{
    config = servletconfig;
    init();
}

public void init()
    throws ServletException
{
}

Что на самом деле делает метод init?Я что-то упустил?

Ответы [ 4 ]

14 голосов
/ 28 февраля 2011

Да, это ничего не делает. Это могло бы быть абстрактно, но тогда каждый сервлет был бы вынужден это реализовать. Таким образом, по умолчанию ничего не происходит на init(), и каждый сервлет может переопределить это поведение. Например, у вас есть два сервлета:

public PropertiesServlet extends HttpServlet {

   private Properties properties;

   @Override
   public void init() {
       // load properties from disk, do be used by subsequent doGet() calls
   }
}

и

public AnotherServlet extends HttpServlet {

   // you don't need any initialization here, 
   // so you don't override the init method.
}
8 голосов
/ 28 февраля 2011

Из Javadoc :

/**
 *
 * A convenience method which can be overridden so that there's no need
 * to call <code>super.init(config)</code>.
 *
 * <p>Instead of overriding {@link #init(ServletConfig)}, simply override
 * this method and it will be called by
 * <code>GenericServlet.init(ServletConfig config)</code>.
 * The <code>ServletConfig</code> object can still be retrieved via {@link
 * #getServletConfig}. 
 *
 * @exception ServletException  if an exception occurs that
 *                  interrupts the servlet's
 *                  normal operation
 *
 */

Так что ничего не делает и просто удобство.

3 голосов
/ 09 июля 2015

Конструктор может не иметь доступа к ServletConfig, поскольку контейнер не вызвал метод init(ServletConfig config).

init() метод унаследован от GenericServlet, в качестве свойства которого ServletConfig. Вот как HttpServlet и какой пользовательский сервлет, который вы пишете, расширяя HttpServlet, получает ServletConfig.

и GenericServlet реализуют ServletConfig, который имеет метод getServletContext. так что ваш пользовательский метод сервлетов init будет иметь доступ к обоим из них.

1 голос
/ 18 июля 2018

Контейнер сервлета вызывает метод сервлета init() перед обработкой клиентских запросов.Он вызывается один раз после создания сервлета.По умолчанию это ничего не делает.Вы можете переопределить этот метод, и он также хорош для выполнения одноразовых действий.Например, подключение к базе данных или чтение данных конфигурации и т. Д.

public void init(ServletConfig config) throws ServletException {
     super.init(config);

     // You can define your initial parameter in web.xml file.
     String initialParameter = config.getInitParameter("initialParameter");
     // Do some stuff with initial parameters

}

Что произойдет, если метод init () сгенерирует исключение?

Сервлет destroy() не будетвызван, потому что это неуспешная инициализация.Контейнер сервлета может попытаться создать экземпляр и инициализировать новый экземпляр этого неисправного сервлета позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...