Параметризованный конструктор в сервлете - PullRequest
3 голосов
/ 03 июня 2009

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

Если нет, то почему?

Ответы [ 4 ]

8 голосов
/ 03 июня 2009

номер

Экземпляры сервлета создаются контейнером посредством отражения, и они ожидают найти открытый конструктор без аргументов (конструктор по умолчанию).

Чтобы настроить свой сервлет, используйте параметры сервлета, указанные в файле web.xml. Они передаются в ваш сервлет init() метод.


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

Часть причины может быть исторической; сервлеты были впервые заданы задолго до того, как системы внедрения зависимостей широко применили эту альтернативу. Однако такие конструкторы были бы довольно ограничены; было бы целесообразно передавать аргументы, которые могут быть созданы из простой символьной строки, указанной в файле web.xml, но более полезные объекты & mdash; a DataSource, например & mdash; будут неудобны.

Было бы неплохо иметь в сервлете конечные переменные-члены.

JSR, ранее известный как "WebBeans" (я думаю, что JSR 299), предоставит некоторые стандарты для поддержки внедрения зависимостей в сервлетах. Это может устранить некоторые недостатки текущего подхода.

1 голос
/ 22 июля 2011

нет! мы не можем предоставить параметризованный конструктор в сервлете. Контейнер сервлета создает объект для sevrlet. Контейнер создаст объект на основе Class.forName(String classname). мы можем создать объект для класса, используя Class.forName(), если класс содержит только конструктор по умолчанию. Поскольку контейнер использует код Class.forName() при создании объекта, мы не пишем параметризованный конструктор как часть сервлета. Даже если мы хотим написать параметризованный конструктор, мы должны вызвать конструктор из service() метода!

1 голос
/ 03 июня 2009

Вам нужно будет инициализировать переменные с помощью <servlet-param> или использовать такую ​​среду, как Spring, которая может позволить вам прокси сервлетов через другой класс, который действует так же, как любой другой бин.

1 голос
/ 03 июня 2009

Так как сервлеты создаются контейнером, им нужен конструктор без аргументов.

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

...