2009-06-03 7 views

Répondre

8

n °

instances de Servlet sont créés par le conteneur par réflexion, et ils attendent de trouver un public constructeur sans arg (le constructeur par défaut).

Pour configurer votre servlet, utilisez les paramètres de servlet spécifiés dans le fichier web.xml. Ceux-ci sont transmis à la méthode init() de votre servlet.


Alors qu'il serait possible pour un conteneur de servlet pour choisir un constructeur non défini par défaut et forcer les chaînes de caractères à des types simples et appeler le constructeur pensivement, ce n'est pas ce que la spécification Servlet exige.

Une partie de la raison peut être historique; Les servlets ont d'abord été spécifiés longtemps avant que les systèmes d'injection de dépendance rendent cette alternative largement pratiquée. Cependant, ces constructeurs seraient assez limités; il serait pratique de passer des arguments qui peuvent être créés à partir d'une simple chaîne de caractères spécifiée dans le fichier web.xml, mais des objets plus utiles — un DataSource, par exemple — seraient gênants.

Ce serait bien d'avoir des variables membres finales dans une servlet. Le JSR anciennement connu sous le nom de "WebBeans" (JSR 299, je pense), fournira quelques normes pour la prise en charge de l'injection de dépendances dans les servlets. Cela pourrait remédier à certains des inconvénients de l'approche actuelle.

+0

Mais pourquoi attend-il le constructeur par défaut? Nous pouvons invoquer le constructeur paramétré en utilisant également la réflexion. –

+0

Alors comment va-t-il savoir, quelles valeurs passer dans le constructeur? – artemb

+0

Avez-vous déjà regardé ce que Servlet 3.0 fournit encore? –

1

Comme les servlets sont instanciés par le conteneur, ils ont besoin d'un constructeur sans argument.

En outre, le conteneur peut réutiliser des servlets et ne pas appeler le constructeur en cas de réutilisation.

1

Vous devrez initialiser les variables via <servlet-param> ou utiliser un framework tel que Spring qui peut vous permettre d'utiliser Proxy du servlet dans une classe différente qui agit comme n'importe quel autre bean.

1

non! nous ne pouvons pas fournir un constructeur paramétré dans le servlet. Le conteneur servlet crée l'objet pour sevrlet. Le conteneur crée l'objet basé sur Class.forName(String classname). nous pouvons créer un objet à une classe en utilisant Class.forName(), si la classe contient le constructeur par défaut only.since que le conteneur utilise le code Class.forName() dans la création de l'objet, nous n'écrivons pas de constructeur paramétré en tant que partie servlet. Même si nous voulons écrire un constructeur paramétré, nous avons appelé le constructeur de la méthode service()!

Questions connexes