Разница между методом init() и init(ServletConfig config)

173
15 января 2019, 10:30

Жизненный цикл сервлета начинается с запуска метода init. В абстрактном классе GenericServlet объявлено 2 варианта метода: init() и init(ServletConfig config).

В спецификации указано, что при использовании public void init(ServletConfig config) необходимо первой строкой вызвать super.init(config), иначе ServletConfig будет иметь значение null. Это логично, поскольку в GenericSerlvet есть переменная private transient ServletConfig config.

Однако для удобства, можно использовать public void init().

Откуда в этом случае берется экземпляр типа ServletConfig?

UPD: Можно поставить вопрос по-другому.

За создание экземпляра ServletConfig отвечает контейнер. Тогда почему при init(ServletConfig config) он не создает этот экземляр, а при init() создает?

UPD2: Когда какой метод лучше использовать?

Answer 1

Как мне кажется, метод javax.servlet.GenericServlet#init() существует только для того, чтобы его переопределять. При этом он не абстрактный для того, чтобы сделать переопределение необязательным. Метод javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) и так вызывает внутри себя метод init(), поэтому стоит пользоваться только методом с аргументом javax.servlet.ServletConfig, но переопределять для дополнительной логики стоит метод init() без аргументов.

Answer 2

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

READ ALSO
Где хранить запускаемый код для бота?

Где хранить запускаемый код для бота?

Написал бота на Java для DiscordПрограмму пока запускаю через компилятор со своего компьютера

180
org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

Бьюсь с ошибками запуска webapp и получаю такой stack:

206
Есть ли в Java что-то похожее на БСП от 1С

Есть ли в Java что-то похожее на БСП от 1С

Есть ли в Java что-то похожее на БСП от 1СВ кратце про БСП

160
Как с помощью JAVA скачать файл с кодировкой gzip?

Как с помощью JAVA скачать файл с кодировкой gzip?

Изучаю JAVA и столкнулся с проблемойМне нужно отправить GET запрос на сервер и скачать файл

188