Im folgenden Ausschnitt:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
Was bedeutet /
in der Methode getRealPath()
? Wann sollte ich es benutzen?
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");
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 benutzenGehen 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".
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).
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?
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;
}
}