webentwicklung-frage-antwort-db.com.de

Was bedeutet servletcontext.getRealPath ("/") und wann sollte ich es verwenden?

Im folgenden Ausschnitt:

ServletContext context = request.getServletContext();
String path = context.getRealPath("/");

Was bedeutet / in der Methode getRealPath()? Wann sollte ich es benutzen?

55
saplingPro

Einführung

Mit ServletContext#getRealPath() soll ein Pfad für Webinhalte (der Pfad in der erweiterten WAR-Ordnerstruktur auf dem Plattendateisystem des Servers) in einen absoluten Plattendateisystempfad konvertiert werden.

Der "/" steht für das Stammverzeichnis des Webinhalts. Das heißt Es stellt den Ordner web wie in der folgenden Projektstruktur dar:

YourWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    |-- index.jsp
 |    `-- login.jsp
 :    

Wenn Sie also "/" an getRealPath() übergeben, erhalten Sie den absoluten Pfad zum Dateisystem des Ordners /web der erweiterten WAR-Datei des Projekts. So etwas wie /path/to/server/work/folder/some.war/, das Sie in File oder FileInputStream weiterverwenden können sollten.

Beachten Sie, dass die meisten Starter nicht zu erkennen scheinen, dass Sie tatsächlich den gesamten Webinhaltspfad zu ihm übergeben können, und dass sie häufig verwenden

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp";

anstatt

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp");

Schreibe niemals Dateien hinein

Beachten Sie auch, dass, obwohl Sie mit FileOutputStream neue Dateien darin schreiben können, alle Änderungen (z. B. neue Dateien oder bearbeitete Dateien) verloren gehen wann immer der WAR umverteilt wird; mit dem einfachen Grund, dass all diese Änderungen nicht in der ursprünglichen WAR-Datei enthalten sind. Alle Starter, die versuchen, hochgeladene Dateien dort zu speichern, machen es also falsch.

Darüber hinaus gibt getRealPath() immer null oder einen völlig unerwarteten Pfad zurück, wenn der Server nicht zum Erweitern der WAR-Datei in das Festplattendateisystem konfiguriert ist, sondern stattdessen in z. Speicher als virtuelles Dateisystem.

getRealPath() ist nicht portierbar; du solltest es besser nie benutzen

Gehen Sie mit getRealPath() vorsichtig um. Es gibt tatsächlich keine vernünftigen Anwendungsfälle für die reale Welt. Wenn Sie lediglich die Webressource InputStream abrufen müssen, sollten Sie stattdessen ServletContext#getResourceAsStream() verwenden. Dies funktioniert unabhängig von der Art und Weise, in der die WAR erweitert wird. Also, wenn Sie zum Beispiel ein InputStream von index.jsp wollen, dann tun Sie nicht :

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!

Aber machen Sie stattdessen:

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!

Wenn Sie eine Liste aller verfügbaren Webressourcenpfade abrufen möchten, verwenden Sie stattdessen ServletContext#getResourcePaths() .

Set<String> resourcePaths = servletContext.getResourcePaths("/");

Sie können eine einzelne Ressource als URL über ServletContext#getResource() beziehen. Dies gibt null zurück, wenn die Ressource nicht existiert.

URL resource = servletContext.getResource(path);

Wenn Sie beabsichtigen, eine hochgeladene Datei zu speichern oder eine temporäre Datei zu erstellen, lesen Sie die folgenden Links "Siehe auch".

Siehe auch:

102
BalusC

Der Kontextpfad einer Webanwendung ist das Verzeichnis, das das WEB-INF-Verzeichnis der Webanwendung enthält. Es kann als das "Zuhause" der Web-App betrachtet werden. Beim Schreiben von Webanwendungen kann es oft wichtig sein, den tatsächlichen Speicherort dieses Verzeichnisses im Dateisystem abzurufen, da Sie so beispielsweise Dateien lesen oder in Dateien schreiben können.

Diese Position kann über die getRealPath () - Methode des ServletContext-Objekts abgerufen werden. Dieser Methode kann ein String-Parameter auf File.separator übergeben werden, um den Pfad mithilfe des Dateiseparators des Betriebssystems abzurufen ("/" für UNIX, "\" für Windows). 

3
Sathish

Es gibt auch einen Wechsel zwischen Java 7 und Java 8. Zugegebenermaßen handelt es sich um einen veralteten Aufruf, aber ich musste ein "/" hinzufügen, um unser Programm zum Laufen zu bringen! Hier ist der Link, der das Thema bespricht Warum gibt servletContext.getRealPath bei Tomcat 8 den Wert null zurück?

2
user96265

Meine Methode: 

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try {
        String path = request.getRealPath("/WEB-INF/conf.properties");
        Properties p = new Properties();
        p.load(new FileInputStream(path));

        String StringConexion=p.getProperty("StringConexion");
        String User=p.getProperty("User");
        String Password=p.getProperty("Password");
    }
    catch(Exception e){
        String msg = "Excepcion " + e;
    }
}
0
Julio Azocar