Вопрос-ответ

What does servletcontext.getRealPath("/") mean and when should I use it

Что означает servletcontext.getRealPath("/") и когда я должен его использовать

В следующем фрагменте:

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

Что / в методе getRealPath() представляет? Когда я должен его использовать?

Переведено автоматически
Ответ 1

Введение

ServletContext#getRealPath() предназначен для преобразования пути к веб-контенту (пути в расширенной структуре папок WAR в файловой системе диска сервера) в абсолютный путь к файловой системе диска.

"/" представляет корень веб-контента. Т. е. он представляет web папку, как в приведенной ниже структуре проекта:

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

Итак, передача "/" to getRealPath() вернет вам абсолютный путь файловой системы на диске к /web папке расширенного файла WAR проекта. Что-то вроде, /path/to/server/work/folder/some.war/ которое вы должны иметь возможность в дальнейшем использовать в File или FileInputStream.

Обратите внимание, что большинство начинающих, похоже, не видят / осознают, что вы действительно можете передать ему весь путь к веб-контенту и что они часто используют

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

или даже

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

вместо

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

Никогда не записывайте туда файлы

Также обратите внимание, что, хотя вы можете записывать в него новые файлы с помощью FileOutputStream, все изменения (например, новые файлы или отредактированные файлы) будут теряться при повторном запуске WAR; по той простой причине, что все эти изменения не содержатся в исходном файле WAR. Итак, все новички, которые пытаются сохранить загруженные файлы в нем, делают это неправильно.

Более того, getRealPath() всегда возвращает null или совершенно неожиданный путь, когда сервер настроен не на расширение файла WAR в файловую систему диска, а вместо этого, например, в память как виртуальную файловую систему.

getRealPath() является непереносимым; вам лучше никогда его не использовать

Используйте getRealPath() осторожно. На самом деле для этого нет никаких разумных вариантов использования в реальном мире. Основываясь на моем 20-летнем опыте работы с Java EE, всегда существовал другой способ, который намного лучше и переносим, чем getRealPath().

Если все, что вам действительно нужно, это получить InputStream веб-ресурс, лучше используйте ServletContext#getResourceAsStream() вместо этого, это будет работать независимо от способа расширения WAR. Итак, если вы, например, хотите InputStream of index.jsp, то не делайте:

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

Но вместо этого делаю:

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

Или, если вы намерены получить список всех доступных путей к веб-ресурсам, используйте ServletContext#getResourcePaths() вместо этого.

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

Вы можете получить отдельный ресурс как URL через ServletContext#getResource(). Это вернет null когда ресурс не существует.

URL resource = servletContext.getResource(path);

Или если вы собираетесь сохранить загруженный файл или создать временный файл, тогда смотрите ссылки "Видеть также" ниже.

Смотрите также:

Ответ 2

Контекстный путь веб-приложения - это каталог, содержащий каталог WEB-INF веб-приложения. Его можно рассматривать как "домашний" веб-приложения. Часто при написании веб-приложений может быть важно получить фактическое местоположение этого каталога в файловой системе, поскольку это позволяет вам выполнять такие вещи, как чтение из файлов или запись в файлы.

Это местоположение может быть получено с помощью метода getRealPath() объекта ServletContext. Этому методу можно передать строковый параметр, установленный в File.separator, чтобы получить путь, используя разделитель файлов операционной системы ("/" для UNIX, "\" для Windows).

Ответ 3

Также есть изменения между Java 7 и Java 8. По общему признанию, это связано с устаревшим вызовом, но мне пришлось добавить "/", чтобы заставить нашу программу работать! Вот ссылка, в которой обсуждается это Почему ServletContext.getRealPath возвращает null в tomcat 8?

Ответ 4

Мой метод:

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;
}
}
java servlets