Что / в методе getRealPath() представляет? Когда я должен его использовать?
Переведено автоматически
Ответ 1
Введение
ServletContext#getRealPath() предназначен для преобразования пути к веб-контенту (пути в расширенной структуре папок WAR в файловой системе диска сервера) в абсолютный путь к файловой системе диска.
"/" представляет корень веб-контента. Т. е. он представляет web папку, как в приведенной ниже структуре проекта:
Итак, передача "/" to getRealPath() вернет вам абсолютный путь файловой системы на диске к /web папке расширенного файла WAR проекта. Что-то вроде, /path/to/server/work/folder/some.war/ которое вы должны иметь возможность в дальнейшем использовать в File или FileInputStream.
Обратите внимание, что большинство начинающих, похоже, не видят / осознают, что вы действительно можете передать ему весь путь к веб-контенту и что они часто используют
Также обратите внимание, что, хотя вы можете записывать в него новые файлы с помощью FileOutputStream, все изменения (например, новые файлы или отредактированные файлы) будут теряться при повторном запуске WAR; по той простой причине, что все эти изменения не содержатся в исходном файле WAR. Итак, все новички, которые пытаются сохранить загруженные файлы в нем, делают это неправильно.
Более того, getRealPath() всегда возвращает null или совершенно неожиданный путь, когда сервер настроен не на расширение файла WAR в файловую систему диска, а вместо этого, например, в память как виртуальную файловую систему.
getRealPath() является непереносимым; вам лучше никогда его не использовать
Используйте getRealPath() осторожно. На самом деле для этого нет никаких разумных вариантов использования в реальном мире. Основываясь на моем 20-летнем опыте работы с Java EE, всегда существовал другой способ, который намного лучше и переносим, чем getRealPath().
Если все, что вам действительно нужно, это получить InputStream веб-ресурс, лучше используйте ServletContext#getResourceAsStream() вместо этого, это будет работать независимо от способа расширения WAR. Итак, если вы, например, хотите InputStream of index.jsp, то не делайте:
Контекстный путь веб-приложения - это каталог, содержащий каталог WEB-INF веб-приложения. Его можно рассматривать как "домашний" веб-приложения. Часто при написании веб-приложений может быть важно получить фактическое местоположение этого каталога в файловой системе, поскольку это позволяет вам выполнять такие вещи, как чтение из файлов или запись в файлы.
Это местоположение может быть получено с помощью метода getRealPath() объекта ServletContext. Этому методу можно передать строковый параметр, установленный в File.separator, чтобы получить путь, используя разделитель файлов операционной системы ("/" для UNIX, "\" для Windows).
Ответ 3
Также есть изменения между Java 7 и Java 8. По общему признанию, это связано с устаревшим вызовом, но мне пришлось добавить "/", чтобы заставить нашу программу работать! Вот ссылка, в которой обсуждается это Почему ServletContext.getRealPath возвращает null в tomcat 8?