# java ResourceLocator



## Generic1 (7. Feb 2011)

Hallo,

ich habe in meiner Spring - Web- Application einen Ordner unter WebContent, in dem sich einige XML- Dateien befinden, die ich per AJAX zum Client senden möchte. 
Ich hab dass in einem Servlet jetzt so gemacht, dass ich den absoluten Pfad angegeben habe, also unter Ubuntu: "/home/myname/myapplication/myproject/WebContent/myfolder/myxml.xml"

Das ist jetzt aber in zweierlei Hinsicht schlecht:

1. kann ich die Applikation nicht auf einem anderen Rechner/Server deployen
2. ich kann in der XML datei während des Betriebs nichts ändern.

Jetzt wollte ich Punkt 1 mal ausbessern, indem ich einen ResouceLocator verwenden wollte aber da wurde mir bei "ClassPathXMLResourceLocator#exists()" false zurückgegeben.

Weiß jemand, wie ich 1. am besten lösen könnte mit dem ResourceLocator, hat jemand eine Ahnung was ich da falsch mache bzw. hat jemand ein Beispiel wie man das macht.

zu 2.: Da wird mir wahrscheinlich nichts anderes übrig bleiben als das ich die XML- Files in eine DB speichere um diese dann zur Laufzeit ändern zu können, oder?

lg


----------



## FArt (7. Feb 2011)

Generic1 hat gesagt.:


> Hallo,
> 
> ich habe in meiner Spring - Web- Application einen Ordner unter WebContent, in dem sich einige XML- Dateien befinden, die ich per AJAX zum Client senden möchte.
> Ich hab dass in einem Servlet jetzt so gemacht, dass ich den absoluten Pfad angegeben habe, also unter Ubuntu: "/home/myname/myapplication/myproject/WebContent/myfolder/myxml.xml"
> ...



Resourcelocator ist m.E. der falsche Ansatz, bzw. sollte verwendet werden wenn andere Ansätze scheitern. Was spricht dagegen, die XML Dateien aus dem Klassenpfad des Servlets zu laden, bzw. warum müssen diese geändert werden (falsches Design?)...
Wenn das aus dem Klassenpfad nicht funktioniert, warum versuchst du es dann mit einem ClasspathResoruceLocator und nicht aus dem Filesystem, oder eben, wie du schon bemerkt hast aus der DB?


----------



## Generic1 (7. Feb 2011)

>> die XML Dateien aus dem Klassenpfad des Servlets zu laden, bzw. warum müssen diese geändert werden (falsches Design?)...

Wie kann ich das machen? Die XML- Dateien müssen deshalb geändert werden, weil da News (in meinem Fall Event- News) drinnenstehen, die sich von Zeit zu Zeit ändern.


----------



## FArt (7. Feb 2011)

Generic1 hat gesagt.:


> >> die XML Dateien aus dem Klassenpfad des Servlets zu laden, bzw. warum müssen diese geändert werden (falsches Design?)...
> 
> Wie kann ich das machen? Die XML- Dateien müssen deshalb geändert werden, weil da News (in meinem Fall Event- News) drinnenstehen, die sich von Zeit zu Zeit ändern.



Wer ändert diese Daten? Sind solche Daten nicht sinnvoller in einer DB aufgehoben? Welchen zwingenden Grund gibt es diese in Dateiform zu halten?


----------



## Generic1 (7. Feb 2011)

Sie sind dann leichter editierbar wenn ich z.B.: header und text in einem Tag habe und wenn ich diese dann mittels AJAX zum Client schick, dann ist XML im Client auch leichter auszulesen, deshalb hab ich mich für XML entschieden.
Wenn ich das ganze XML jetzt in der DB habe, dann muss ich das zuerst auslesen, dann eine XML daraus machen und dann erst mittels AJAX zum Client schicken -> das hab ich in diesem Fall als ziemlich aufwendig empfunden, deshalb hab ich gleich ein XML- File gemacht.
Fällt euch da vielleicht noch eine bessere?


----------



## FArt (7. Feb 2011)

Wer editiert warum die XML Daten, also warum müssen die Daten editierbar sein?
Ist das ein Hack zur Entwicklungszeit? Soll produktiv an den Daten geändert werden?


----------



## Generic1 (7. Feb 2011)

Der Admin (also ich wenns meine WebSeite ist) editiert die XML - Dateien damit von zeit zu Zeit neue Infos am Client angezeigt werden.
Das sollte schon auch im produktiven Zustand funktionieren also ohen das ich neu deployen muss.


----------



## Generic1 (8. Feb 2011)

Ich frag mich jetzt gerade, wie ich das in der DB speichern soll, es gibt ja mehrere Events:

DB- Table:

```
ID | HEADER | TEXT
1     Header1   Text1
2     Header2   Text2 
....
```

Da müsste ich jetzt dann für jeden Event eine eigene Tabelle machen, da ja sonst die Texte zu allen Events in einer Tabelle wären und ich jetzt eigentlich nicht so richtig weiß nach was ich da filtern soll.
Auf der anderen Seite, für jeden Event eine neue Tabelle anlegen ist auch nicht das wahre.
Hat da jemand eine Idee wie ich aus einer Tabelle vernünftig ausfiltern kann?
lg


----------



## FArt (9. Feb 2011)

Wenn es unbedingt XML Dateien sein müssen:
Die meisten Server unterstützen hot deployment. Baue dir einen Service (kann ein SLSB sein), welcher deine XMLs ausliefert. Dieses EJB wird mit den XMLs zusammend deployt und lädt die XMLs aus dem Klassenpfad. Wenn du die Dateien ändern möchtest, dann machst du ein Hotdeployment dieses Beans mit Ressourcen.
Das wäre ok, wenn das eher Ausnahmefälle sind.

Wenn das ein Feature der Applikation sein soll, dann ist XML (bzw. Files) die falsche Wahl. Schreibe die Daten in die Datenbank. 

Wenn beides nicht passt, dann nimm einen passenden ResourceLocator, also einen der auf das Filesystem geht. Das finde ich persönlich aber nur dann eine gute Lösung, wenn eine Fileschnittstelle als Anforderung unabdingbar gesetzt ist.

Nach was willst du denn Filtern, wenn du die Dinger in die DB schreibst? Nach was filterst du denn jetzt auf Dateibasis?


----------



## Generic1 (9. Feb 2011)

Jetzt ist es so, dass ich in der View eine ComboBox habe und wenn ich einen Eintrag selektiere, dann schick ich diesen Eintrag zum Backend und dort gibt es genau eine Datei, die so heißt wie das selektierte Item z.B.: Münchner Lauf und im Backend häng ich dann noch ein xml drann -> die Datei heißt dann "Münchner Lauf.xml"


----------



## FArt (9. Feb 2011)

Generic1 hat gesagt.:


> Jetzt ist es so, dass ich in der View eine ComboBox habe und wenn ich einen Eintrag selektiere, dann schick ich diesen Eintrag zum Backend und dort gibt es genau eine Datei, die so heißt wie das selektierte Item z.B.: Münchner Lauf und im Backend häng ich dann noch ein xml drann -> die Datei heißt dann "Münchner Lauf.xml"



Aua... tu das nicht.
Das Editieren ist also eine regläre Funktion deiner Applikation und wird oft benötigt. Schreib das Zeug in eine Datenbank. Diese Fileschnittstelle ist ein äußerst schlechtes Design für dynamischen bzw. veränderbaren Content deiner Applikation.


----------



## Generic1 (10. Feb 2011)

Ja, ich weiß, deshalb die Frage hier, dann muss ich mir halt noch was suchen, nach dem ich filtere in meiner DB, die schaut ja dann so ungefähr aus:


```
HEADER              |              TEXT
  
     Lauf Düsseldorf                       Dieser Lauf ist hervorragend :-) ...
     Marathon München                  blabla
     Düsseldorf                             Unterkunft in ...
```

Es kann aber jetzt in Düsseldorf 2 Läufe geben und ich weiß jetzt nicht genau, wie ich das am Besten machen kann, ich müsstewahrscheinlich eine ID vergeben oder so. 
Hat da jemand eine Idee?

Und meine zweite Frage wäre jetzt, wenn ich die "Tuples" jetzt aus der DB auslese, macht es sinn dann aus diesem Tuples eine XML- Struktur zu erzeugen, damit ich die dann am Client einfacher verarbeiten kann?
lg


----------



## FArt (10. Feb 2011)

Generic1 hat gesagt.:


> Ja, ich weiß, deshalb die Frage hier, dann muss ich mir halt noch was suchen, nach dem ich filtere in meiner DB, die schaut ja dann so ungefähr aus:
> 
> 
> ```
> ...



Der "Filter" ist doch jetzt im Prinzip im sprechenden Filenamen verbaut, oder? Da musst du somit nichts ändern. Sonst kannst du ja noch Stichworte vergeben, evtl. ein Datum dazu, eine laufende Nummer usw. Vielleicht auch Referenzen auf andere Beiträge pflegen (ältere oder verwandte) usw.

Wenn auf der Empfängerseite bereits XML verarbeitet wird oder wenn es einfach ist mit XML auf der Clientseite zu arbeiten, ist es nicht sehr kompliziert auf der Serverseite das XML on-the-fly zu generieren und über die Leitung zu schicken. Da würden mir APIs wie Castor oder JAXB uvm. einfallen, die ein Mapping von XML <-> Java-Klassen realisieren.


----------

