2008-09-03 6 views
4

Gibt es eine Möglichkeit in der Servlet-API, auf Eigenschaften zuzugreifen, die in web.xml angegeben sind (z. B. Initialisierungsparameter) innerhalb einer Bean- oder Factory-Klasse, die überhaupt nicht mit dem Webcontainer verknüpft ist?Gibt es eine Möglichkeit, von einem Java Bean auf web.xml-Eigenschaften zuzugreifen?

Zum Beispiel schreibe ich eine Factory-Klasse, und ich möchte einige Logik in der Factory enthalten, um eine Hierarchie von Dateien und Konfigurationsspeicherorten zu überprüfen, welche verfügbar sind, um zu bestimmen, welche Implementierungsklasse zu instanziieren - zum Beispiel

  1. eine Immobilien in der classpath-Datei,
  2. ein web.xml Parameter,
  3. eine Systemeigenschaft oder
  4. einige Standard-Logik, wenn nichts anderes zur Verfügung steht.

Ich möchte in der Lage sein, dies zu tun, ohne jeden Hinweis auf ServletConfig oder etwas ähnlich zu meiner Fabrik Injektion - sollte der Code läuft ok außerhalb eines Servlet-Container kann.

Das hört sich vielleicht ein wenig ungewöhnlich an, aber ich möchte, dass diese Komponente, an der ich arbeite, mit einer unserer Webapps gepackt werden kann und außerdem so vielseitig ist, dass sie mit einigen unserer Befehle verpackt werden kann -line-Tools, ohne dass eine neue Eigenschaftendatei nur für meine Komponente benötigt wird - also hoffte ich, über andere Konfigurationsdateien wie web.xml zu hüpfen.

Wenn ich mich richtig erinnere, hat .NET so etwas wie Request.GetCurrentRequest() einen Verweis auf die aktuell ausgeführte Request zu bekommen - aber da es sich um eine Java-Anwendung Ich bin auf der Suche nach etwas simliar, die verwendet werden könnten, Zugang zu ServletConfig zu gewinnen.

Antwort

5

Eine Möglichkeit, Sie könnten dies tun zu tun ist:

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; 
    } 
} 

Und dann die folgenden haben in Ihr web.xml

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

Wenn Ihre Anwendung in einem Web-Container ausgeführt wird, dann wird der Hörer vom Container aufgerufen werden, wenn der Kontext erstellt wurde. In diesem Fall wird die Datei _servletContextProperties durch alle in der Datei web.xml angegebenen Kontextparameter ersetzt.

Wenn Ihre Anwendung außerhalb eines Webcontainers ausgeführt wird, ist _servletContextProperties leer.

1

Haben Sie in Betracht gezogen, das Spring-Framework dafür zu verwenden? Auf diese Weise erhalten Ihre Bohnen keinen zusätzlichen Graft, und Spring übernimmt die Konfiguration für Sie.

0

Ich denke, dass Sie eine zugeordnete Bootstrap-Klasse hinzufügen müssen, die einen Verweis auf eine ServletConfig (oder ServletContext) und überträgt diese Werte auf die Factory-Klasse. Auf diese Weise können Sie es separat verpacken.

@toolkit: Gut, die meisten gedemütigt - Dies ist etwas, das ich versucht haben, für eine Weile

Verwandte Themen