Zugriff auf externe Dateien

mmonshausen

Grünschnabel
Hallo,
ich habe eine kurze Frage: Ich habe ein Servlet, dass eine Konfigurationsdatei erhalten soll, die es beim Start lesen soll. Das Servlet ist zusammen mit anderen Servlets in einem war-File verpackt. Ich möchte es jetzt so machen, dass die Konfigurationsdatei außerhalb des war-Archivs (aber noch auf dem AS) abgelegt werden soll; schließlich soll der Admin nicht das war neu packen müssen.
Aber wie greife ich jetzt auf die Datei zu? Mein Context-Root zeigt immer nur auf den Root in dem War-File...
Vielen Dank für Eure Antworten,

Martin
 
Hallo,

schau mal hier:
Java:
package de.tutorials.web;

import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: ExampleServlet
 * 
 */
public class ExampleServlet extends javax.servlet.http.HttpServlet implements
		javax.servlet.Servlet {

	// oder besser key als init parameter in der servletdefintion im web.xml
	// ablegen
	public static final String CONFIGRUATION_FILE_NAME = "de.tutorials.web.config.properties";

	static final long serialVersionUID = 1L;

	Map<?, ?> readOnlyConfigurationSettingsMap;

	/*
	 * (non-Java-doc)
	 * 
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public ExampleServlet() {
		super();
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		Properties properties = new Properties();
		try {
			properties.load(getServletContext().getClass().getClassLoader()
					.getResourceAsStream(CONFIGRUATION_FILE_NAME));
		} catch (IOException e) {
			e.printStackTrace();
		}

		this.readOnlyConfigurationSettingsMap = Collections.unmodifiableMap(properties);

	}

	/*
	 * (non-Java-doc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
	 *      HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().println("Hallo " + readOnlyConfigurationSettingsMap.get("foo"));

	}

	/*
	 * (non-Java-doc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
	 *      HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
}

Damit kannst du ein File (hier: de.tutorials.web.config.properties) ins TOMCAT_HOME/lib Verzeichnis legen (bei Tomcat 6) und darauf zugreifen.

de.tutorials.web.config.properties
Code:
foo=Bar

Gruß Tom
 
Hallo,
vielen Dank für die schnelle Antwort!

Ich habe das auch gleich ausprobiert jedoch nicht mit sonderlich viel Erfolg. Bestimmt stelle ich mich einfach nur blöd an...

Ich habe einen JBoss AS (hätte ich dazu sagen sollen, SORRY) und habe wie beschrieben das property-file in den lib-Ordner gelegt (JBoss basiert ja in punkto Servlets auf TomCat).
Jedoch scheint die Ressource nicht gefunden zu werden:
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Unknown Source)
at java.util.Properties.load0(Unknown Source)
at java.util.Properties.load(Unknown Source)
at com.merobase.WSExec.ReqPageGen.init(ReqPageGen.java:59)

in Zeile 59 steht: properties.load(getServletContext().getClass().getClassLoader()
.getResourceAsStream(CONFIG_FILE_NAME))

Meine Anwendung liegt in /server/default/deploy; ausprobiert habe ich die Datei in /server/default/lib abzulegen...

Btw: Neben den property-files wollte ich auch templates für Velocity extern (da der Benutzer die anlegen dürfen soll) ablegen; ist es architektonisch in Ordnung die ebenfalls im lib-Verzeichnis abzulegen?

Vielen Dank und sorry für die blöde Frage,

Martin
 
Hallo,

eine Möglichkeit wäre es die Konfigurationsdatei im JBOSS_HOME/server/XXX/data Verzeichnis abzulegen.

Anschließend kann man dann so darauf zugreifen:
Java:
package de.tutorials.web;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: ExampleServlet
 * 
 */
public class ExampleServlet extends javax.servlet.http.HttpServlet implements
        javax.servlet.Servlet {

    // oder besser key als init parameter in der servletdefintion im web.xml
    // ablegen
    public static final String CONFIGRUATION_FILE_NAME = "de.tutorials.web.config.properties";
    public final static String JBOSS_DATA_DIR_LOCATION = System.getProperty("jboss.server.data.dir");
    
    static final long serialVersionUID = 1L;

    Map<?, ?> readOnlyConfigurationSettingsMap;

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public ExampleServlet() {
        super();
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream(JBOSS_DATA_DIR_LOCATION +"/" + CONFIGRUATION_FILE_NAME));
        } catch (IOException e) {
            e.printStackTrace();
        }

        this.readOnlyConfigurationSettingsMap = Collections.unmodifiableMap(properties);

    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("Hallo " + readOnlyConfigurationSettingsMap.get("foo"));

    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }
}
Das Problem hierbei ist das File IO innerhalb eines Servlets laut J2EE/JEE Spec nicht unterstützt ist.

Desweiteren wird dein Servlet somit von JBoss abhängig, wenn man hier keine Indirektion (ConfigurationProviderStrategy) einführt...

Eine Alternative dazu wäre noch das sogenannte Exploded Deployment:
http://wiki.jboss.org/wiki/Wiki.jsp?page=ExplodedDeployment


Gruß Tom
 
Zurück