Domanda

C'è un modo nella Servlet API per accedere a proprietà specificate nel web.xml (come ad esempio i parametri di inizializzazione) dall'interno di un Fagiolo o una classe Factory che non è associato con il contenitore web?

Per esempio, sto scrivendo una classe Factory, e mi piacerebbe includere un po ' di logica all'interno della Fabbrica per controllare una gerarchia di file di configurazione e posizioni per vedere quali sono disponibili per determinare quale classe di implementazione per creare un'istanza - per esempio,

  1. un file di proprietà nel classpath,
  2. un web.xml parametro,
  3. un sistema di proprietà, o
  4. alcune logica predefinita se non altro è disponibile.

Mi piacerebbe essere in grado di fare questo senza l'iniezione di qualsiasi riferimento a ServletConfig o qualcosa di simile per la mia Fabbrica - il codice deve essere in grado di eseguire ok al di fuori di un Servlet Container.

Questo potrebbe sembrare un po ' insolito, ma mi piacerebbe per questo componente a cui sto lavorando per essere in grado di essere confezionato con una delle nostre applicazioni, e anche abbastanza versatile per essere confezionato con alcuni dei nostri strumenti da riga di comando senza la necessità di un nuovo file di proprietà solo per la mia componente - così mi è stato sperando di piggyback sulla cima di altri file di configurazione, come web.xml.

Se ricordo correttamente .NET ha qualcosa di simile Request.GetCurrentRequest() per ottenere un riferimento all'esecuzione Request - ma dal momento che questo è un app Java sto cercando qualcosa di simliar che potrebbe essere utilizzato per accedere a ServletConfig.

È stato utile?

Soluzione

Un modo che si potrebbe fare è questo:

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

E poi sono i seguenti web.xml

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

Se la vostra applicazione è in esecuzione in un contenitore web, quindi l'ascoltatore verrà richiamato dal contenitore una volta che il contesto è stato creato.In questo caso, il _servletContextProperties sarà sostituito con qualsiasi ambito-parametri specificati nel web.xml.

Se la vostra applicazione è in esecuzione al di fuori di un contenitore web, quindi _servletContextProperties sarà vuota.

Altri suggerimenti

Avete considerato che utilizzano il framework Spring per questo?In questo modo, i fagioli non si guadagna irreparabili, e la primavera gestisce la configurazione di installazione per voi.

Penso che si dovrà aggiungere un associato di bootstrap di classe, che richiede un riferimento a un ServletConfig (o ServletContext) e trascrive i valori la classe Factory.Almeno in questo modo è possibile creare un pacchetto separatamente.

@toolkit :Ottimo, più umile - Questo è qualcosa che ho cercato di fare per un po

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top