GenericServlet в методах инициализации java-2 - PullRequest
2 голосов
/ 20 января 2011

Класс GenericServlet имеет два метода init.Почему это так?

Ответы [ 4 ]

6 голосов
/ 20 января 2011

В javadoc ясно, почему:

init():

Удобный метод, который можно переопределить, чтобы не было необходимости вызыватьsuper.init (конфигурация).Вместо переопределения init(ServletConfig), просто переопределите этот метод, и он будет вызван GenericServlet.init(ServletConfig config).ServletConfig объект все еще может быть получен через getServletConfig().

Так что, если ваш сервлет не заботится о ServletConfig, тогда просто реализуйте init().

1 голос
/ 22 февраля 2012

Есть два метода init () как часть универсального класса сервлета.

  1. init (конфигурация ServletConfig)
  2. Init ()

Пример программы сервлета для понимания 2 init () и их использования.

public class TestServlet extends HttpServlet{

    public void init() throws......
    {
        System.out.println("we are in 2nd init() ");
    }
    public void service(HttpServlet.........)throws .....{
        System.out.println("we are in TestServlet");
    }

}

Шаги, выполняемые при развертывании вышеуказанного сервлета на сервере.

  1. После развертывания проекта, когда клиент впервые отправляет запрос на Затем TestServlet сервер создает объект testServlet, а затем вызывает сначала init () метод (init (конфигурация ServletConfig)). Затем JVM проверяет первый метод init () в TestServlet, поскольку он не доступен, тогда он также проверяет в суперклассе HttpServlet первый метод init недоступен, затем JVM проверяет суперкласс HttpServlet, т.е. Класс GenericServlet там сначала доступен init (), затем JVM выполняет его и вызывает Второй init () в качестве второго init () непосредственно доступен в TestServlet, а затем JVM выполняет его.

-> Совсем не рекомендуется использовать первый метод init (), когда мы используем HttpServlet.

-> В чем заключались проблемы и почему нам не рекомендуется использовать first init ()?

Первый подход:

public class TestServlet extends HttpServlet
    {
      public void init(ServletConfig config) throws.....
      {
        config=getServletConfig();
        String paramName = config.getInitParameter("ParameterName");
        System.out.println("paramName");
      }
    public void service(HttpServlet request ..........)throws .......
    {
        System.out.println("we are in 2nd service method()");
    }

}

Следующие шаги выполняются при развертывании вышеуказанного сервлета. Объект a.Servlet создан, и все переменные экземпляра суперкласса объявлены со значением по умолчанию, то есть со значением null. Затем JVM выполняет первый метод init (), как он был доступен в TestServlet, он выполняет его, но getServletConfig () доступен в GenericServlet, поэтому конфигурация установлена к нулю, когда клиент отправляет запрос на TestServlet, мы столкнемся с выполнением Null Pointer.

Второй подход

//Sample code
  ServletConfig config;
public void init(ServletConfig config){
    this.config=config;
    String fileName = config.getInitParameter("ParameterName");
    System.out.println(config);
}

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

Третий подход:

//approach1 problem can be resolved by calling the super class init() so that config object 
//will returned which we can use in init() of our servlet.
super.init(config);
config=getServletConfig();

Таким образом, для вышеупомянутых резонаторов Sun рекомендует использовать 2nd init () как часть нашего сервлета. Поскольку мы не предоставляем first init () как часть нашего кода, JVM будет вызывать первый метод init () GenericServlet .

0 голосов
/ 29 апреля 2017

Всякий раз, когда отправляется первый запрос, веб-контейнер всегда вызывает метод init (ServletConfig config). Из-за того, что объект конфигурации сохраняется в объекте функции, а затем внутренний вызов метода init (). Настоятельно рекомендуется переопределить метод init (). В этом методечтобы инициализировать ваши собственные действия. Таким образом, просто говоря, что init (servletConfig config) предназначен для цели веб-контейнера, а метод init () предназначен для цели программиста. Таким образом, GenericServlet содержит два метода init ().

0 голосов
/ 20 января 2011

По сути, genericServlet ничего не делает, есть два метода инициализации

1) init (): удобный метод, который можно переопределить, чтобы не нужно было вызывать super.init (конфигурация).

2) init (ServletConfig config): вызывается контейнером сервлета, чтобы указать сервлету, что сервлет вводится в эксплуатацию.

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