# Server Pfad



## MQue (29. Jul 2009)

Hallo,

mal wieder eine unmögliche Frage, ich komm leider nicht drauf, ich hab in meiner Webanwendung eine Plain Old Java Klasse, in der ich einen Pfad auf ein Bild benötige, welche am Server im Ordner 

Web Pages -> pics -> MeinBild.png  (NetBeans hat den Ordner Web Pages für die Webdateien)

liegt. 

Habs schon so probiert:


```
file = new File("./pics/MeinBild.png");
```

Da bekomme ich vom Tomcat die Fehlermeldung:


```
java.io.FileNotFoundException: C:\Programme\Apache Software Foundation\Apache 
Tomcat 6.0.18\bin\.\pics\MeinBild.png (Das System kann den 
angegebenen Pfad nicht finden)
```

Wie gebe ich den Pfad richtig an, damit ich am Server auf das Bild zugreifen kann?

Vielen Dank für die Hilfe


----------



## FArt (30. Jul 2009)

Deploye das Bild mit deiner Webapplikation und lade es über den Classloader.


----------



## mvitz (30. Jul 2009)

Oder direkt in einer JSP mit (vorrausetzung Core Tag Library inkludiert)

```
<img src="<c:url value="/pics/MeinImage.png" />" />
```

Weiß ja nicht, ob du mit dem Bild noch was außer dem anzeigen machen möchtest.


----------



## MQue (30. Jul 2009)

Im dist- Ordner meiner IDE gibt es eine *.war in der sich ja alles befindet, der pics Ordner, der WEB-INF Ordner, in der sich die Ordner "classes" und "lib" befinden und ich weiß jetzt eben nicht wie ich in meiner *.class Datei im Ordner "classes" auf die Bilder im "pics" ordner komme, Ich möchte die Bilder im "pics"- Ordner lassen und nicht in eine *.jar verpacken und diese dann in den Classpath hinzufügen,

gibt es da eine Möglichkeit,

lg


----------



## maki (30. Jul 2009)

Wo _genau_ liegen denn die Bilder, im Classpath (WEB-INF/classes, WEB-INF/lib) oder einfach nur so in Ordnern?

Wenn sie im Classpath liegen, dann wird das mit der JSP nicht mehr funktionieren, da kein Client direkt auf WEB-INF zugreifen darf.
Würde da wohl ein sog. "Stream Servlet" bauen und dieses dann per JSP aufrufen, mit den entsprechenden Parametern in der URL, dann wie von FArt vorgeschlagen über den Classloader laden und streamen.

Oder einfach in einen Ordner der Webapp und dann so wie von habi55 vorgeschlagen aus der JSP laden.


----------



## MQue (30. Jul 2009)

maki hat gesagt.:


> Wo _genau_ liegen denn die Bilder, im Classpath (WEB-INF/classes, WEB-INF/lib) oder einfach nur so in Ordnern?



Liegen einfauch nur so in einem Ordner auf gleicher ebene wie WEB-INF, da wird mir nichts anderes übrigbleiben als den "pics"- Ordner in den WEB-INF- Ordner zu kopieren, oder?

Vielen Dank,
lg


----------



## maki (30. Jul 2009)

Nein, einfach wie von habi55 vorgeschlagen in der JSP einbinden.


----------



## MQue (30. Jul 2009)

maki hat gesagt.:


> Nein, einfach wie von habi55 vorgeschlagen in der JSP einbinden.



Ich brauchs leider in einem Servlet, ich weiß jetzt zwar, dass eine JSP auch ein Servlet wird aber ich weiß nicht, wie ich im Sevlet auf das Bild verweisen kann,

lg


----------



## maki (30. Jul 2009)

Der SerlvetContext hat eine Methode die sich getRealPath nennt: Java 2 Platform EE v1.3: Interface ServletContext


----------



## FArt (30. Jul 2009)

Mein Tipp: mach es richtig und baue nicht irgendeine Workaround, den du (wie man sieht) auch nur mit Mühe und Not hinbekommst... 
Annahme: dir ist die Struktur eines WARs bekannt und du weißt auch was man wann wo darin ablegt. Greife NIE direkt (z.B. Fileoperationen) auf Ressorucen außerhalb der Webapplikation zu!


----------



## MQue (30. Jul 2009)

FArt hat gesagt.:


> Mein Tipp: mach es richtig und baue nicht irgendeine Workaround, den du (wie man sieht) auch nur mit Mühe und Not hinbekommst...
> Annahme: dir ist die Struktur eines WARs bekannt und du weißt auch was man wann wo darin ablegt. Greife NIE direkt (z.B. Fileoperationen) auf Ressorucen außerhalb der Webapplikation zu!



Komm leider nicht hin, ich poste mal die Verzeichnisstruktur hier, vielleicht könntet Ihr dann nochmal schreiben, wies gehen könnte, ich hab schon (fast) alles ausprobiert.
Ich möchte also von einem Source Package raus uf pics zugreifen.

lg


----------



## maki (30. Jul 2009)

FArt hat gesagt.:


> Mein Tipp: mach es richtig und baue nicht irgendeine Workaround, den du (wie man sieht) auch nur mit Mühe und Not hinbekommst...
> Annahme: dir ist die Struktur eines WARs bekannt und du weißt auch was man wann wo darin ablegt. Greife NIE direkt (z.B. Fileoperationen) auf Ressorucen außerhalb der Webapplikation zu!


Ist doch hier gar nicht der Fall 

Was er will ist einfach Bilder die in der WebApp liegen aus einem Servlet laden, der Weg wurde schon beschrieben.

Nebenbei, wie würdest du das machen ohne direkt auf das Dateisystem zuzugreifen, wenn deine WebApp permantente Dateien speichert? Innerhalb der WebApp ist das imho  keine gute Idee.
Den Weg den ich da gehe ist in der web.xml ein Init-Param zu erzeugen mit dem Pfad zum Ordner für die Dateien.

Klar, in einem EJB Server würde da ein JCA Connector diesen Dienst leisten, aber für WebApp kenne ihc so etwas nicht.

@Michael, wo ist denn jetzt das Problem, oder läuft alles?


----------



## MQue (30. Jul 2009)

maki hat gesagt.:


> @Michael, wo ist denn jetzt das Problem, oder läuft alles?



Das Problem ist noch immer, dass ich nicht weiß, was ich da für einen Pfad herschreiben soll:


```
file = new File("keine Ahnung was ich da für einen Pfad herschreiben soll");
```


----------



## maki (30. Jul 2009)

Hab dir doch den Link gepostet... den ServletContext holen, dann mit getRealPath("/pics") den Pfad holen und schon hast du den Pfad zum Verzeichnis, dann noch das Unterverzeichnis + den Dateinamen angeben.


----------



## MQue (30. Jul 2009)

maki hat gesagt.:


> Hab dir doch den Link gepostet... den ServletContext holen, dann mit getRealPath("/pics") den Pfad holen und schon hast du den Pfad zum Verzeichnis, dann noch das Unterverzeichnis + den Dateinamen angeben.



Danke, Klappt!!


----------



## FArt (30. Jul 2009)

maki hat gesagt.:


> Was er will ist einfach Bilder die in der WebApp liegen aus einem Servlet laden, der Weg wurde schon beschrieben.



Eben. Das macht man wenn ich richtig informiert bin über einen Classloader oder (wenn es um statische Inhalte aus der Webapplikation geht) über den ServletContext mit getResource bzw. getResourceAsStream (zumindest steht das so in der Servlet Spec SRV.3.5).



maki hat gesagt.:


> Nebenbei, wie würdest du das machen ohne direkt auf das Dateisystem zuzugreifen, wenn deine WebApp permantente Dateien speichert? Innerhalb der WebApp ist das imho  keine gute Idee.
> Den Weg den ich da gehe ist in der web.xml ein Init-Param zu erzeugen mit dem Pfad zum Ordner für die Dateien.
> Klar, in einem EJB Server würde da ein JCA Connector diesen Dienst leisten, aber für WebApp kenne ihc so etwas nicht.


Von schreiben war ja nicht die Rede, denn das macht die Sache (wie du schon gesagt hast) komplizierter und ist in einer Webapplikation keine gute Idee (laut J2EE-Spec verboten).


----------



## maki (30. Jul 2009)

> Eben. Das macht man wenn ich richtig informiert bin über einen Classloader oder (wenn es um statische Inhalte aus der Webapplikation geht) über den ServletContext mit getResource bzw. getResourceAsStream (zumindest steht das so in der Servlet Spec SRV.3.5).


Ok, da stand ich vorhin auf dem Schlauch.
Hast recht, sollte nicht als File geladen werden!

@Michael1234, nimm lieber diese Mthode: : Interface ServletContext)



> Von schreiben war ja nicht die Rede, denn das macht die Sache (wie du schon gesagt hast) komplizierter und ist in einer Webapplikation keine gute Idee (laut J2EE-Spec verboten).


Soweit ich weiss bezieht sich das aber auf EJBs, aber wenn man die WebApp in einem Cluster hat, ist es natürlich genauso daneben.


----------



## FArt (31. Jul 2009)

maki hat gesagt.:


> Soweit ich weiss bezieht sich das aber auf EJBs, aber wenn man die WebApp in einem Cluster hat, ist es natürlich genauso daneben.



Webapplikation und JEE kann man nicht so einfach trennen, ganz abgesehen von Clustering usw. Beide Specs haben durchaus Überschneidungen bzw. enge Berührungspunkte. Auch Webserver wie Tomcat bewegen sich immer mehr in Richtung Applikationsserver.

Man sollte als Entwickler im Entperpriseumfeld beide Specs kennen und sich immer entsprechend konform verhalten. Das hat einfach viele Vorteile, denn man spart sich oft viel Ärger (der meistens erste sehr spät eintritt, nämlich im produktiven Betrieb oder bei einer Migration oder nach Einspielen eines Patches). Dazu kommt, dass in der Regel das Design davon profitiert, z.B. durch klare Trennung der Verantwortlichkeiten.


----------

