2008-09-03 6 views
4

L'API Servlet peut-elle accéder aux propriétés spécifiées dans web.xml (telles que les paramètres d'initialisation) à partir d'une classe Bean ou Factory qui n'est pas associée du tout au conteneur Web? Par exemple, j'écris une classe Factory, et je voudrais inclure une certaine logique dans l'usine pour vérifier une hiérarchie de fichiers et d'emplacements de configuration pour voir lesquels sont disponibles pour déterminer la classe d'implémentation à instancier - par exemple,Existe-t-il un moyen d'accéder aux propriétés web.xml à partir d'un bean Java?

  1. un fichier de propriétés dans le classpath,
  2. un paramètre web.xml,
  3. une propriété du système, ou
  4. une certaine logique par défaut si rien d'autre est disponible.

Je voudrais être en mesure de le faire sans injecter toute référence à ServletConfig ou quoi que ce soit à mon usine similaire - le code devrait être en mesure de fonctionner ok en dehors d'un conteneur de servlets. Cela peut sembler un peu rare, mais j'aimerais que ce composant sur lequel je travaille puisse être empaqueté avec l'un de nos webapps, et aussi être assez polyvalent pour être emballé avec certains de nos command Je devais utiliser des outils en ligne sans avoir besoin d'un nouveau fichier de propriétés pour mon composant. J'espérais donc utiliser d'autres fichiers de configuration tels que le fichier web.xml.

Si je me souviens bien, .NET a quelque chose comme Request.GetCurrentRequest() pour obtenir une référence à l'exécution en Request - mais puisque c'est une application Java Je cherche quelque chose simliar qui pourrait être utilisé pour accéder à ServletConfig.

Répondre

5

Une façon vous pouvez faire est:

public class FactoryInitialisingServletContextListener implements ServletContextListener { 

    public void contextDestroyed(ServletContextEvent event) { 
    } 

    public void contextInitialized(ServletContextEvent event) { 
     Properties properties = new Properties(); 
     ServletContext servletContext = event.getServletContext(); 
     Enumeration<?> keys = servletContext.getInitParameterNames(); 
     while (keys.hasMoreElements()) { 
      String key = (String) keys.nextElement(); 
      String value = servletContext.getInitParameter(key); 
      properties.setProperty(key, value); 
     } 
     Factory.setServletContextProperties(properties); 
    } 
} 

public class Factory { 

    static Properties _servletContextProperties = new Properties(); 

    public static void setServletContextProperties(Properties servletContextProperties) { 
     _servletContextProperties = servletContextProperties; 
    } 
} 

Et alors ce qui suit dans votre web.xml

<listener> 
    <listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class> 
</listener> 

Si votre application est en cours d'exécution dans un conteneur Web, l'auditeur sera invoquée par le conteneur une fois que le contexte a été créé. Dans ce cas, _servletContextProperties sera remplacé par n'importe quel paramètre de contexte spécifié dans le fichier web.xml.

Si votre application s'exécute en dehors d'un conteneur Web, _servletContextProperties sera vide.

1

Avez-vous envisagé d'utiliser le framework Spring pour cela? De cette façon, vos haricots ne sont pas surchargés, et le ressort gère la configuration de configuration pour vous.

0

Je pense que vous devrez ajouter une classe bootstrap associée qui prend une référence à un ServletConfig (ou ServletContext) et transcrit ces valeurs dans la classe Factory. Au moins, vous pouvez l'emballer séparément.

@toolkit: Excellent, la plupart humiliés - C'est quelque chose que j'ai essayé de le faire pendant un certain temps

Questions connexes