Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Servlet Pfad und URL

0 views
Skip to first unread message

duffy-hh

unread,
Nov 22, 2005, 6:51:51 AM11/22/05
to
Moin zusammen,

ich suche eine einfache Möglichkeit, in einem Servlet die Pfade zum
Servlet herauszubekommen. Dabei benötige ich:
1. den Dateipfad
2. die URL zum Servlet

Die Anweisungen:

System.out.println("PathInfo: "+request.getPathInfo());
System.out.println("PathTranslated: "+request.getPathTranslated());

innerhalb der doGet-Methode des Servlets liefern beide die Ausgabe
"null" und mittels

System.out.println("QueryString: "+request.getQueryString());

erhalte ich natürlich nur den QueryString.

Hat jemand eine Idee, was hinter
String FSpfad = ???;
String URLpfad = ???;
stehen könnte?

Viele Dank
Andreas

Lothar Kimmeringer

unread,
Nov 22, 2005, 7:14:43 AM11/22/05
to
Am 22 Nov 2005 03:51:51 -0800 schrieb duffy-hh:

> ich suche eine einfache Möglichkeit, in einem Servlet die Pfade zum
> Servlet herauszubekommen. Dabei benötige ich:
> 1. den Dateipfad

Ein Servlet kann in einem JAR liegen, das z.B. aus einer Datenbank
gelesen wurde (bzw. die Klasse kann auch direkt aus der Datenbank
gelesen worden sein). Wie genau soll da das Konzept eines
"Dateipfads" greifen?

Vielleicht hilft Dir aber
getServletContext().getRealPath()
(wobei ich das jetzt nicht ausprobiert habe, so dass ich nicht
weiss, was da als Wert bei rauskommt).

> 2. die URL zum Servlet

> Die Anweisungen:
>
> System.out.println("PathInfo: "+request.getPathInfo());
> System.out.println("PathTranslated: "+request.getPathTranslated());
>
> innerhalb der doGet-Methode des Servlets liefern beide die Ausgabe
> "null" und mittels

Das ist klar, da dies der Teil in der URL ist, der _nach_ dem
Servlet kommt, also bei einer URL wie
http://irgendwo.invalid/mein/pfad/Servlet/hallo/pathinfo.txt
waere request.getPathInfo() "/hallo/pathinfo.txt"
und request.getPathTranslated() "/wasauchimmer/hallo/pathinfo.txt"

> System.out.println("QueryString: "+request.getQueryString());
>
> erhalte ich natürlich nur den QueryString.

Auch klar.

Versuchs mal mit request.getRequestURL() (wenn Du die komplette
URL inkl. PathInfo und QueryString haben willst) oder
request.getReqzestURI() wenn's nur die URL sein soll.

> Hat jemand eine Idee, was hinter
> String FSpfad = ???;
> String URLpfad = ???;
> stehen könnte?

Sourcecode mit Compilefehlern?

BTW: All das und noch viel mehr findest Du in den Javadocs
vom Servletframework. Es waere schoen, wenn Du diese in Zukunft
vielleicht selbst konsultierst, bevor Du Fragen solche stellst.


Gruesse, Lothar
--
Lothar Kimmeringer E-Mail: spam...@kimmeringer.de
PGP-encrypted mails preferred (Key-ID: 0x8BC3CD81)

Always remember: The answer is forty-two, there can only be wrong
questions!

duffy-hh

unread,
Nov 22, 2005, 9:11:34 AM11/22/05
to
Hallo Lothar,

viele Dank für die schnelle Antwort.

request.getRequestURI()
liefert mir die gewünschte URL. (Ich muss blind gewesen sein, als ich
mich durch die API geschlagen habe und diese Methode übersehen habe.)

Zum Dateipfad:
Meine .class-Datei liegt in einem Unterverzeichnis meines
JSWDK-Servers.
Ich habe es versucht, mittels
getServletContext().getRealPath()
den Pfad zu meinem Servlet (so etwas wie:
"E:\WebServer\webpages\WEB-INF\servlets\meinServlet.class") zu
erhalten. Nur leider erwartet die Methode getRealPath einen String als
Übergabeparameter. In der Java API steht dazu: "path - a String
specifying a virtual path". Ich habe jetzt verschiedenste Aufrufe
versucht wie:
String path =
this.getServletContext().getRealPath("http://localhost:8080/servlet/meinServlet");
String path =
this.getServletContext().getRealPath("http://localhost:8080/servlet/meinServlet.class");
String path = this.getServletContext().getRealPath("/index.html");
und erhalte immer einen Laufzeitfehler:
java.lang.NullPointerException
at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:201)

Woran liegt das?

Vielen Dank
Andreas

PS: Ich habe jetzt schon wirklich einen halben Tag im Netz nach
Antworten gesucht...

Lothar Kimmeringer

unread,
Nov 22, 2005, 10:21:48 AM11/22/05
to
Am 22 Nov 2005 06:11:34 -0800 schrieb duffy-hh:

> Ich habe es versucht, mittels
> getServletContext().getRealPath()
> den Pfad zu meinem Servlet (so etwas wie:
> "E:\WebServer\webpages\WEB-INF\servlets\meinServlet.class") zu
> erhalten. Nur leider erwartet die Methode getRealPath einen String als
> Übergabeparameter. In der Java API steht dazu: "path - a String
> specifying a virtual path". Ich habe jetzt verschiedenste Aufrufe
> versucht wie:
> String path =
> this.getServletContext().getRealPath("http://localhost:8080/servlet/meinServlet");
> String path =
> this.getServletContext().getRealPath("http://localhost:8080/servlet/meinServlet.class");
> String path = this.getServletContext().getRealPath("/index.html");
> und erhalte immer einen Laufzeitfehler:
> java.lang.NullPointerException
> at
> javax.servlet.GenericServlet.getServletContext(GenericServlet.java:201)
>
> Woran liegt das?

Seltsame Sache das. Passiert das beim Aufruf des Servlets ueber den
Server oder rufst Du die testweise direkt ueber eine Main-Methode
auf? Wenn letzteres wird wohl getServletConfig null zurueckliefern
und zu der Exception fuehren. Anonsten habe ich da auch keine
Erklaerung fuer.

BTW: Ich denke als "virtual path" wird ein "/" reichen, um das
Verzeichnis in dem das Servlet lieft zu bekommen.

Stefan Carstensen

unread,
Nov 22, 2005, 10:27:21 AM11/22/05
to
Lothar Kimmeringer schrieb:

> Am 22 Nov 2005 06:11:34 -0800 schrieb duffy-hh:
>
>
>>Ich habe es versucht, mittels
>> getServletContext().getRealPath()
>>den Pfad zu meinem Servlet (so etwas wie:
>>"E:\WebServer\webpages\WEB-INF\servlets\meinServlet.class") zu
>>erhalten. Nur leider erwartet die Methode getRealPath einen String als
>>Übergabeparameter.

ich meine mich zu erinnern, dass es nach der Spezifikation für Servlet Container
gar nicht erlaubt ist, dem Servlet den physikalichen Ort einer Datei mitzuteilen.

Was aber gehen sollte, ist eine Resource, von der mann weiss, dass sie im Classpath liegt,
über den Classloader zu laden (this.getClassLoader().getResource()) und die zurückgelieferte
URL nach ihrem Pfad zu frage.


Stefan

duffy-hh

unread,
Nov 22, 2005, 11:16:51 AM11/22/05
to
Hallo Stefan,

Danke!
URL url = this.getClass().getResource("/");
liefert mir den Pfad im Filesystem.

Andreas

Michael Thelen

unread,
Nov 23, 2005, 7:41:33 PM11/23/05
to
Nachdem fleißig philosophiert wurde muss ich das hier noch loswerden:

context = this.getServletContext();
path = context.getRealPath("WEB-INF/servlets/");

Das sollte funktionieren.

path = context.getRealPath("WEB-INF/servlets/meinServlet.class");

Vielleicht funktioniert das auch. Die Struktur sollte aber meines
Wissens /WEB-INF/classes und /WEB-INF/lib sein, oder? Oder ist das nur
bei Tomcat so?

Das sagt die API-DOC dazu:

public java.lang.String getRealPath(java.lang.String path)

Returns a String containing the real path for a given virtual path.
For example, the path "/index.html" returns the absolute file path on
the server's filesystem would be served by a request for
"http://host/contextPath/index.html", where contextPath is the context
path of this ServletContext..

The real path returned will be in a form appropriate to the
computer and operating system on which the servlet container is running,
including the proper path separators. This method returns null if the
servlet container cannot translate the virtual path to a real path for
any reason (such as when the content is being made available from a .war
archive).

Ich finde das sagt alles ;-)! Wenn das so nicht funktioniert stimmt was
mit der Implementierung nicht. In Tomcat 4.1.31 tut das!

Gruß
Michael

0 new messages