2010-11-16 30 views
18

J'ai un fichier java régulier que j'utilise pour mettre à jour et interroger une base de données mysql mais j'ai besoin de prendre des options configurables dans ce fichier (comme nom d'hôte, mot de passe, etc) et le mettre dans le fichier web.xml (ou peut-être un autre fichier si c'est une option, mais idéalement dans web.xml).Comment puis-je lire les valeurs de paramètre de contexte/web.xml dans un fichier java non-servlet?

Mais je ne sais pas comment accéder aux valeurs web.xml à partir d'un fichier java non-servlet standard.

Ou aurais-je besoin de lire le xml (comme tout autre fichier xml ... ou est-il un itinéraire raccourci vers cette ...)

+1

Vous avez eu vraiment de mentionner que ce "fichier régulier Java non servlet" est instancié et exécuté dans 'ServletContextListener # contextInitialized()' (selon votre question précédente). Cela ferait beaucoup de différence dans la bonne réponse ... – BalusC

+0

Quel serveur utilisez-vous? Tomcat, JBoss, ??? En fonction du serveur, les paramètres peuvent être définis au niveau de l'instance du serveur de plusieurs manières. – stjohnroe

Répondre

3

Une façon est de lire le fichier xml et l'analyser.

Vous pouvez le mettre sur une carte statique après l'analyse syntaxique dans ServletContextListener

30

Vous avez besoin de mettre les paramètres requis dans les entrées env-entrée de votre fichier web.xml:

<env-entry> 
    <env-entry-name>dbhost</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>localhost</env-entry-value> 
</env-entry> 

et accès eux via le contexte JNDI

import javax.naming.Context; 
import javax.naming.InitialContext; 
... 
// Get the base naming context 
Context env = (Context)new InitialContext().lookup("java:comp/env"); 

// Get a single value 
String dbhost = (String)env.lookup("dbhost"); 
+0

Veillez à spécifier le type d'entrée env avant la valeur d'entrée env ou vous risquez d'obtenir des erreurs de validation XML. – luke

+0

Peut-être que vous pouvez ajouter les importations. :) – alexander

+0

@alexander là vous allez – stjohnroe

10

Vous pouvez utiliser contexte paramètres dans votre web.xml et un javax.servlet.ServletContextListener pour peupler une fi statique les champs.

Dans votre classe Java normale, vous lisez ces champs statiques.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
... 
<context-param> 
    <description>Prameter</description> 
    <param-name>myParam</param-name> 
    <param-value>123456790</param-value> 
</context-param> 
... 
</web-app> 

Vous pouvez accéder à ce paramètre de contexte avec ServletContext.getInitParameter

0

Créer une classe statique qui serait initialisé de l'un des servlets init.

+1

La difficulté ici est dans * quel * init de servlet. Vous ne voulez pas que votre application dépende du moment où Servlet est initialisée en premier. –

1

Mettre en œuvre un ServletContextListener:

package util; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

public class MyConfigListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     ServletContext ctx = sce.getServletContext(); 

     String hostname = ctx.getInitParameter("my.config.hostname"); 

     // now go and do something with that 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 

} 

Et ne pas oublier de l'enregistrer dans web.xml:

<context-param> 
    <param-value>somewhere.example.org</param-value> 
    <param-name>my.config.hostname</param-name> 
</context-param> 
<listener> 
    <listener-class>util.MyConfigListener</listener-class> 
</listener>