web-dev-qa-db-fra.com

Comment lire des valeurs de paramètre de contexte/web.xml dans un fichier Java non-servlet?

J'ai un fichier Java standard que j'utilise pour mettre à jour et interroger une base de données mysql mais je dois prendre des options configurables dans ce fichier (comme nom d'hôte, mot de passe, etc.) et le placer dans le fichier web.xml fichier si c'est une option, mais idéalement dans web.xml).

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

Ou aurais-je besoin de lire le xml (comme n'importe quel autre fichier xml ... ou existe-t-il un raccourci pour cela ...) 

19
Kirn

Vous devez mettre les paramètres requis dans les entrées env-entry 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 ensuite y accéder 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");
30
stjohnroe

Vous pouvez utiliser des paramètres de contexte dans votre fichier web.xml et un fichier javax.servlet.ServletContextListener pour renseigner certains champs statiques.

Dans votre classe Java normale, vous lisez ceci 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

10
Ralph

Une solution consiste à lire le fichier XML et à l'analyser.

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

3
Jigar Joshi

Implémentez une 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 n'oubliez pas 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>
1
Hank

Créez une classe statique qui serait initialisée à partir de l'un des servlets init .

0
Eugene Kuleshov