XML Datei mit (JSP) MBean, JDOM aufrufen

Merschi

Grünschnabel
Hallo zusammen,

ich möchte mit JSP ein Menu sowie einen Sitepath aus einer XML-Datei generieren. Den Zugriff auf die XML-Datei möchte ich allerdings mit einer MBean (Managed Bean) und JDOM realisieren und auf diese MBean dann mittels "jsp:usebean..." zugreifen.

  • Mein Problem:Ich schaffe es nicht mit der MBean auf die XML-Datei zu zugreifen.

  • Mein Ansatz:
    War es mit "Document doc = builder.build(new File("menu.xml))" die XML-Datei zu holen. Die XML-Datei liegt im gleichen Verzeichnis wie die MBean Klasse.

  • Fehlermeldung:
    Nach dem ich mit Netbeans in den Glassfish-Server deployed und die Seite im Browser aufgerufen habe, erhalte ich folgende Fehlermeldung.
  • "java.io.FileNotFoundException: C:\glassfish\domains\domain1\config\menu.xml"

  • Meine Vermutung: Ich denke, da das Webprojekt in ein ".war" gekapselt und dann in den Webserver (Glassfish) deployed wird, kann ich mit "new File("Menu.xml")" nicht einfach zugreifen und brauche eine Art Pfad zur gepackten ".war" Datei.

Ich würde mich über jegliche Hilfe sehr freuen.

Gruss

Merschi
 
Hallo Merschi,

vielleicht hilft dir das:

Code:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputSource is = new InputSource(classLoader.getResourceAsStream("menu.xml")); 
Document doc=builder.build(is);

Der Classloader holt dir hierbei den Pfad und übergibt ihn als InputSource.

Bei mir funktioniert diese Lösung. Allerdings suche ich selber nach einer Alternative, da ich ungern mit dem Classloader arbeiten möchte.
Kennt sich jemand damit aus? Ich würde gerne im JBoss innerhalb meiner .jar File eine XML Datei parsen. Die sucht er aber standardmäßig im JBOSS_HOME/bin-Verzeichnis.
Gibt es eine Möglichkeit dem JBoss das Verzeichnis der XML Datei innerhalb der .jar Datei bekanntzugeben? Oder ist die Classloader Methode die einzige, die Sinn macht?
Ich wär echt froh über eine Antwort.

MfG,

dr_d00m
 
Hallo und danke dr_d00m,

ich hatte auch schon mal einen ähnlichen Ansatz mit nem classLoader. Hatte aber nicht so richtig geklappt.

Bei deinem Ansatz bekomme ich jetzt folgende Fehlermeldung.

java.net.MalformedURLException

Vielleicht muss ich die "menu.xml" doch noch irgendwo anders ablegen? Oder anders gefragt, wo legt man sie am besten ab :)

In einem anderen Forum hab ich folgende Info bekommen.

http://forums.java.net/jive/thread.jspa?messageID=230078&#230078

Wenn man sich die Resource über den ServletContext holen will, gäb es diese Möglichkeit:

http://jguru.com/faq/view.jsp?EID=225150

Allerdings finde ich es so nicht sauber aber umständlich gelöst.

Gibt es vielleicht irgend ne saubere Möglichkeit über meine bean an eine XML-Datei zu kommen?
 
Hallo Merschi,
also bei meiner Variante hab ich die Datei relativ zum root Verzeichnis der jar Datei abgelegt. Also wenn die Datei noch in irgendeinem Verzeichnis liegt, musst du sie entsprechend mit Verzeichnisnamen angeben.

Code:
InputSource is = new InputSource(classLoader.getResourceAsStream("verzeichnis/menu.xml"));

MaformedURLException hört sich nämlich schwer nach falscher Pfadangabe an.

Weiter weis ich da leider auch nicht, weil ich dann mit meinem Java-Latein am Ende bin.
Vielleicht kennt sich ja jemand besser mit der Materie aus.


Gruß,

dr_d00m
 
Hallo,

leider hab ich es immer noch nicht geschafft :)

Was heisst den relativ zum root verzeichnis? Ich habe die menu.xml im Verziechnis WEB-INF/classes abgelegt. Also genau da, wo meine bean liegt.

Ich denke aus Sicherheitsgründen ist es auch gut, dass die Datei im jar-File liegt, damit man nicht gleich von aussen auf die Datei u. U. zugreifen kann.
 
Hallo Merschi,

also root Verzeichnis meint hier sowas wie das Hauptverzeichnis der jar-Datei.

beispiel.jar
--WEB-INF
---classes
--ordner1
--ordner2

In diesen Beipiel wäre also alles unterhalb von beispiel.jar im root-Verzeichnis.

In deinem Fall würdest du die menu.xml dann wahrscheinlich wie folgt auslesen:
Code:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputSource is = new InputSource(classLoader.getResourceAsStream("WEB-INF/classes/menu.xml"));

und zur Verarbeitung würde dann etwas wie das hier benutzt:
Code:
Document menuFile;
menuFile=builder.build(is);
Element root=menuFile.getRootElement();
/* nun folgt die weitere Verarbeitung des root-Elements */

Hierbei meint root Element natürlich das der xml-Datei;)

Ich hoffe das hilft...

Gruß,

dr_d00m
 

Neue Beiträge

Zurück