почему мы не можем инициализировать сервлет, используя сам конструктор? - PullRequest
3 голосов
/ 27 мая 2010

Почему мы должны переопределить метод init () в сервлетах, в то время как мы можем выполнить инициализацию в конструкторе и заставить веб-контейнер вызывать конструктор, передавая ссылку ServletConfig сервлету при вызове конструктора?

Контейнер Ofcourse должен использовать отражение для этого, но контейнер должен использовать отражение в любом случае, чтобы вызвать простой конструктор без аргументов

Ответы [ 4 ]

14 голосов
/ 27 мая 2010

Поскольку конструктор не может быть частью интерфейса, он не может быть "формально" задан в API сервлета, в отличие от обычных методов. Более того, поскольку в Java нет деструкторов, в любом случае необходим метод destroy, поэтому определение соответствующего метода init делает API более согласованным и простым в использовании.

Использование отражения для обнаружения / проверки параметров конструктора просто излишне усложнит ситуацию, и я не вижу никакой дополнительной ценности.

5 голосов
/ 27 мая 2010

Объект сервлета имеет четко определенный жизненный цикл, в котором этапы создания и инициализации различны. Обычно вы не хотите выполнять тяжелую и ненадежную работу в конструкторах, например получение пула соединений с БД или инициализация кеша. У вас есть шанс сделать это после успешного создания объекта сервлета.

Также здесь http://oreilly.com/catalog/jservlet/chapter/ch03.html является исторической причиной:

Метод init () обычно используется для инициализации сервлета - создания или загрузка объектов, которые используются сервлетом при обработке его запросов. Почему бы не использовать вместо этого конструктор? Что ж, в JDK 1.0 (для которого изначально были написаны сервлеты) конструкторы для динамически загружаемых классов Java (таких как сервлеты) не могли принимать аргументы.

Итак, чтобы предоставить новому сервлету любую информацию о себе и своей среде, серверу пришлось вызвать метод init () сервлета и передать объект, который реализует интерфейс ServletConfig.

Кроме того, Java не позволяет интерфейсам объявлять конструкторы. Это означает, что интерфейс javax.servlet.Servlet не может объявить конструктор, который принимает параметр ServletConfig. Он должен объявить другой метод, например, init (). Конечно, вы по-прежнему можете определять конструкторы для своих сервлетов, но в конструкторе у вас нет доступа к объекту ServletConfig или возможности генерировать исключение ServletException.

2 голосов
/ 27 мая 2010

Одной из причин является то, что у вас нет доступа к объекту ServletConfig в конструкторе. Объект ServletConfig создается после , вызывается конструктор и до init (). Таким образом, вы не можете получить доступ к параметрам инициализации сервлета в конструкторе.

1 голос
/ 17 февраля 2015

Классы реализации сервлета могут иметь конструктор, но они должны использовать метод init () для инициализации сервлета по двум причинам: во-первых, вы не можете объявлять конструкторы в интерфейсе в Java, что означает, что вы не можете применить это требование к любому классу, который реализует интерфейс сервлета и во-вторых, сервлету требуется объект ServletConfig для инициализации, который создается контейнером, поскольку он также имеет ссылку на объект ServletContext, который также создается контейнером.

Сервлет - это интерфейс, определенный в пакете javax.servlet, а HttpServlet - это класс, и, как и любой другой класс в Java, он может иметь конструктор, но вы не можете объявить конструктор внутри интерфейса в Java. Если вы не предоставите явный конструктор, то компилятор добавит конструктор по умолчанию без аргументов в любой класс реализации сервлета. Еще одна причина, по которой вам не следует инициализировать сервлет с использованием конструктора, поскольку сервлеты не создаются напрямую Java-кодом, а контейнеры создают там экземпляры и хранят их в пуле. Поскольку контейнеры с веб-серверов, таких как Tomcat и Jetty, используют Java Reflection для создания экземпляра сервлета, присутствие конструктора аргументов не обязательно. Поэтому, если вы случайно предоставите параметрический конструктор и забудете написать конструктор без аргументов, веб-контейнер не сможет создать экземпляр вашего сервлета, поскольку конструктор по умолчанию отсутствует. Помните, компилятор Java не добавляет конструктор по умолчанию без аргументов, если в классе присутствует параметрический конструктор. Вот почему не рекомендуется указывать конструктор в классе сервлетов.

...