# Dynamic Web Project -> file



## PollerJava (2. Aug 2010)

Hallo,

ich habe ein ganz normales Dynamic Web Project mit Eclipse erzeugt und möchte jetzt, dass ich gewisse Daten in einem File speichern kann. Dazu hab ich mir ein File (test.txt) unter "ProjektName/WebContent/test.txt" angelegt. 
Von einem Servlet aus (im Package com.company.controller) möchte ich nun in die Datei test.txt schreiben.
Wie muss ich den Pfad vom servlet aus zu der Datei legen. ich habs schon versucht mit ../../../ProjektName/WebContent/test.txt (.. für den Package namen), aber das funktioniert nicht.
Oder weiß jemand eine bessere Idee?
Vielen Dank,


----------



## homer65 (2. Aug 2010)

Ich vermute es muß nicht /WebContent/test.txt sondern WebContent/test.txt ohne den / sein.


----------



## maki (2. Aug 2010)

Es gibt kein WebContent für die WebApp, nur für die IDE.

Abgesehen davon kann man nicht einfach so in Dateien schreiben die in der WebApp liegen, weil es u.U. gar keine Dateien gibt.

Suche doch mal ein bisschen im Forum hier, gab es sehr oft.


----------



## PollerJava (2. Aug 2010)

OK, ich hab jetzt in der *.ear und dann in der *.war nachgesehen, es gibt wie erwartet den Ordner WebContent wirklich nicht,
nach was soll ich da suchen in diesem Forum, hab schon gesucht, bin aber nicht auf den gewünschten Sucherfolg gekommen,
vielen Dank,


----------



## maki (2. Aug 2010)

OK, Suchbegriffe dafür sind wirklich schwer zu finden.

Tatsache ist: Du sollst in WebApps gar nicht mit java.io.File arbeiten (oder Jars, EARs, usw.), und auf keinen Fall versuchen in Dateien zu schreiben die zur WebApp gehören.
Begründet ist das in Servlet Spek., es gibt keine Garantie dass es wirklich Dateien gibt, also die War entpackt wird, manche Server entpacken nach jedem Neustart alles neu -> Änderungen werden überschrieben

Lösungen gibt es dafür,die Frage lautet aber: Was hast du denn vor? bzw. Warum möchtest du denn in diese Datei schreiben?


----------



## PollerJava (2. Aug 2010)

Ich bin gerade dabei einen "Prototypen" zu bauen, ich gebe über eine JSP- form etwas ein und dass soll dann in einer Datei gespeichert werden, Diese Datei wird dann vielleicht mit einer Datenbank ersetzt aber wer weiß,
Also ich brauche eine ganz einfache Möglichkeit, etwas zu speichern und da ist eben ein file das einfachste. 
Ich habs jetzt so gemacht, dass ich den Pfad auf "C:/test.txt" gelegt habe, und das funktioniert interessanterweise, obwohl ich da acuh ein ungutes gefühl habe, da ich von einem Servlet (einer *.war Datei) auf das lokale Verzeichnis zugreife.

Wie könnt ich das am besten lösen.
lg


----------



## cr4ch (4. Aug 2010)

Also ich hatte so ein "ähnliches" Problem und zwar habe ich eine property Datei mit verschiedenen Einstellungen, auf die ich aber nur lesend zugreife.
jedenfalls liegt die Datei bei mir in /resources/config.properties

Um nun auf die Datei zugreifen zu können

```
getClass().getResource("/resources/config.properties").getFile();
```

Gruß


----------



## maki (4. Aug 2010)

cr4ch,

dein Code hat dasselbe Problem... getRessourceAsStream wäre sauber.


----------



## cr4ch (4. Aug 2010)

@maki

Jo passt schon, aber wenn er doch umbedingt irgendne Datei schreiben will


----------



## maki (4. Aug 2010)

cr4ch hat gesagt.:


> @maki
> 
> Jo passt schon, aber wenn er doch umbedingt irgendne Datei schreiben will


Dann sollte er eine Datei wählen die nicht in der WebApp liegt, und das hat er auch gemacht


----------



## PollerJava (4. Aug 2010)

Also von einer *.ear bzw. einer *.war aus auf eine externe Resource zuzugreifen ist erlaubt/empfehlenswert?
Gibts da nicht irgendwelche sicherheitsbestimmungen wie bei einem Applet (SandBox)?


----------



## maki (4. Aug 2010)

PollerJava hat gesagt.:


> Also von einer *.ear bzw. einer *.war aus auf eine externe Resource zuzugreifen ist erlaubt/empfehlenswert?


Nein, hat auch keiner behauptet.



> Gibts da nicht irgendwelche sicherheitsbestimmungen wie bei einem Applet (SandBox)?


Ähnlich, gehen aber weiter und sind nicht nur für die Sicherheit.


----------



## PollerJava (4. Aug 2010)

maki hat gesagt.:


> Nein, hat auch keiner behauptet.
> 
> Ähnlich, gehen aber weiter und sind nicht nur für die Sicherheit.



OK, aber es funktoniert, wenn man auf externe Resourcen zugreift was bei Applets schon wieder ein bisschen schwieriger ist mit dem signieren.
Ein Datenbankzugriff wäre ja auch ein externer Zugriff und das ist auch erlaubt und entspricht auch dem Standard (vom Persistance- Layer aus), meine Datei sollte nur als Datenbankersatz (einstweilen) dienen. Also ist meiner Meinung nach alles im grünen Bereich denn sonst gibt es ja keine Möglichkeit, außer Datenbanken oder externe Files.
Wie seht ihr das?


----------



## maki (4. Aug 2010)

> Wie seht ihr das?


Vollkommen egal wie "wir" das sehen, es gibt einen Standard, solltest du auch mal lesen 

Dein Vergleich mit Applets passt nicht im geringsten, es geht um andere Dinge, zB. Clusterfähigkeit, Unterstützung von Transaktion, die Tatsache dass es gar keine Dateien geben muss(!).
Sicherheit hat damit nix zu tun.

Deine Lösung ist nur ein Workaround (diplomatisch ausgedrückt), aber gut genug für eine Demo/Prototypen, Produktiv solltest du es schon sauber lösen.


----------



## FArt (5. Aug 2010)

PollerJava hat gesagt.:


> OK, aber es funktoniert, wenn man auf externe Resourcen zugreift was bei Applets schon wieder ein bisschen schwieriger ist mit dem signieren.
> Ein Datenbankzugriff wäre ja auch ein externer Zugriff und das ist auch erlaubt und entspricht auch dem Standard (vom Persistance- Layer aus), meine Datei sollte nur als Datenbankersatz (einstweilen) dienen. Also ist meiner Meinung nach alles im grünen Bereich denn sonst gibt es ja keine Möglichkeit, außer Datenbanken oder externe Files.
> Wie seht ihr das?



Wie du siehst macht das ganze schon in einem Prototypen Probleme. Und was beweist dieser Prototyp, wenn er sich nicht (Spec)konform verhält?
Wenn im Produkt eine DB verwendet werden muss oder soll, dann mach das jetzt auch. Bediene dich einer kleinen DB wie z.B. die HSQL-DB, die du in-process laufen lassen kannst, die sich aber (als Datasource angemeldet) eben wie eine DB verhält, schnell aufgesetzt ist und eher deinem Endprodukt entsprchen wird.

Ein Prototyp, der nur die halbe Applikation abbildet, würde ich keinen Meter weit trauen.


----------



## PollerJava (5. Aug 2010)

Naja, ganz so ist es nicht, Prototyp hab ich deshalb geschreiben da es ein versuch war mit einer externen XML- Datei, da diese aber jetzt so gut funktioniert, wird es auch bei der XML- Datei bleiben.
Jetzt ist nur die Frage, wie man das Professionell aufbaut -> da gibt es ja dann gar keinen möglichkeit, das so zu machen.
Maki hat ja geschrieben, dass ein XML- File im Dynamic Web Projekt nicht dem Standard entspricht und einen externe XML- Datei schon gar nicht.
Jetzt ist halt die Frage wie ich das machen soll, gibts eine Datenbank, in der ich mein XML- File speichern und leicht ändern kann?


----------



## FArt (5. Aug 2010)

PollerJava hat gesagt.:


> Naja, ganz so ist es nicht, Prototyp hab ich deshalb geschreiben da es ein versuch war mit einer externen XML- Datei, da diese aber jetzt so gut funktioniert, wird es auch bei der XML- Datei bleiben.


Ja, das "Ergebnis" war zu erwarten.



PollerJava hat gesagt.:


> Jetzt ist nur die Frage, wie man das Professionell aufbaut


*G*
Das steht bereits in den Antworten weiter oben. 
Ich mag Puritaner sein in dieser Hinsicht, aber auch als pragmatische Lösung rate ich von Zugriffen auf das Filesystem aus einer Enterprise- oder Webapplikation ab... aus Erfahrung und aus gutem Grund.


----------



## vsk (24. Aug 2010)

Wie lesen ich denn jetzt nun eine KonfigurationsDatei ein?

Besser gefragt, wie lege ich den Pfad fest, damit es sowohl unter Linux wie auch Win Umgebung funktioniert? da bleibt mir doch nur der Web-ordner oder? Aber dann wird es mitkompiliert und ist witzlos...:shock:


----------



## maki (24. Aug 2010)

Warum nicht die web.xml nutzen, dafür ist sie ja da?


----------



## vsk (24. Aug 2010)

Ja sehr gern, nutze ich die web.xml 

Aber ein absoluter Pfad, klappt nur bei mir auf der Kiste...
Muss es also ein relativer sein... aber wohin komme ich denn wenn ich "\" aus dem Verzeichnis der web.xml "rausspringe" ? Soll ja unter Linux wie auch Windows funktionieren...

Kurz: was ich nicht raffe ist, wohin lege ich meine Konfig-Dateien (Ordner) und wie trage muss der Value für die web.xml dafür heissen... Das ist mein probläääm


----------



## vsk (26. Aug 2010)

ich werd nicht schlau wie ich in der web.xml einen Dateipfad hinterlegen soll
[XML]<servlet-mapping>
    <servlet-name>myconfig</servlet-name> 
    <url-pattern>/conf/myconfig.xml</url-pattern> 
  </servlet-mapping>[/XML]


```
<%= config.getServletContext() %>
```
funktioniert nicht -> The requested resource () is not available.


----------



## maki (26. Aug 2010)

vsk, wenn man WebApps entwickeln will sollte man sich auch mit der Materie auseinandersetzen.
Da sehe ich bei dir ehrlich gesagt noch riesige defizite, zeigt sich an den fragen die du stellt und am Code den du hier reinstellt.
Und nein, das geht nicht per learing-by-doing.

[xml]<servlet-mapping>
    <servlet-name>myconfig</servlet-name> 
    <url-pattern>/conf/myconfig.xml</url-pattern> 
  </servlet-mapping>[/xml]
Da ist kein "Dateifad" den du hier festlegst, sondern ein mapping zwischen Servlets und URL.
Du willst Servlet Parameter.

[xml]<%= config.getServletContext() %>[/xml]
Der Contextpath hat rein gar nicht mit Servletmappings oder Dateipfaden zu tun.

Tue dir slber einen großen gefallen und fange an zu lesen, die Servlet Spek wäre imho ein guter Startpunkt.


----------



## vsk (26. Aug 2010)

maki hat gesagt.:


> Warum nicht die web.xml nutzen, dafür ist sie ja da?


waren das nicht eure weisen worte?

...bis die Vogonen kommen...


----------



## maki (26. Aug 2010)

> waren das nicht eure weisen worte?


Hätte ich schreiben sollen "Warum nicht die web.xml *richtig* nutzen, dafür ist sie ja da?"?

Wo sonst sollte man Servlet Parameter eintragen wenn nicht in der web.xml?


----------

