C'è un modo per accedere web.xml proprietà da un Java Bean?
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,
- un file di proprietà nel classpath,
- un web.xml parametro,
- un sistema di proprietà, o
- 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
.
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