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

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

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

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

4 ответа

Решение

Вступление

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

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

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

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

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

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

вместо

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

Никогда не пишите файлы там

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

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

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

использование getRealPath() внимательно. На самом деле для этого нет практических вариантов использования. Если все, что вам действительно нужно, это получить InputStream веб-ресурса, лучше использовать ServletContext#getResourceAsStream() вместо этого это будет работать независимо от способа расширения WAR. Итак, если вы, например, хотите InputStream из 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);

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

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

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

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

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

Мой метод:

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;
    }
}
Другие вопросы по тегам