Куда поместить и как считать файлы ресурсов конфигурации в основанном на сервлете приложении?

В моем веб-приложении я должен послать электронное письмо группе предопределенных пользователей как finance@xyz.com, таким образом, я хочу добавить это к a .properties файл и доступ это при необходимости. Действительно ли это - корректная процедура, раз так затем, куда я должен поместить этот файл? Я использую IDE Netbeans, который имеет две отдельных папки для источника и файлов JSP.

215
задан BalusC 10 January 2016 в 00:57
поделиться

3 ответа

Выбор за вами. Существует три основных способа создания архива веб-приложений Java (WAR):


1. Поместите его в classpath

, чтобы вы могли загрузить его с помощью ClassLoader # getResourceAsStream () с путем, зависящим от пути к классам:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);

Здесь предполагается разместить foo.properties в одном из корней, которые покрываются путем к классам по умолчанию веб-приложения, например Webapp's / WEB-INF / lib и / WEB-INF / classes , серверы / lib или JDK / JRE / lib . Если файл свойств специфичен для веб-приложения, лучше всего поместить его в / WEB-INF / classes . Если вы разрабатываете стандартный проект WAR в среде IDE, поместите его в папку src (исходная папка проекта). Если вы используете проект Maven, поместите его в папку / main / resources .

Вы также можете поместить его где-нибудь за пределами пути к классам по умолчанию и добавить его путь в путь к классам сервера приложений. Например, в Tomcat вы можете настроить его как свойство shared.loader для Tomcat / conf / catalina.properties .

Если вы разместили foo.properties , то он находится в структуре пакета Java, например com.пример , то вам нужно загрузить его, как показано ниже

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...

Обратите внимание, что этот путь к загрузчику класса контекста не должен начинаться с / . Только когда вы используете «относительный» загрузчик классов, такой как SomeClass.class.getClassLoader () , вам действительно нужно запускать его с / .

ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...

Однако видимость файла свойств зависит тогда от рассматриваемого загрузчика классов. Он виден только тому же загрузчику классов, который загрузил класс. Итак, если класс загружен, например, общий загрузчик классов сервера вместо загрузчика классов webapp, а файл свойств находится внутри самого webapp, тогда он невидим. Загрузчик классов контекста - ваш самый безопасный вариант, поэтому вы можете разместить файл свойств «везде» в пути к классам и / или намереваетесь иметь возможность переопределить предоставленный сервером файл из веб-приложения.


2. Поместите его в веб-контент

, чтобы вы могли загрузить его с помощью ServletContext # getResourceAsStream () с путем, относящимся к веб-контенту:

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...

Обратите внимание, что я продемонстрировал размещение файла в / WEB -INF , иначе она была бы общедоступной для любого веб-браузера. Также обратите внимание, что ServletContext находится в любом классе HttpServlet , доступном только унаследованному GenericServlet # getServletContext () и в Filter от ] FilterConfig # getServletContext () . Если вы не находитесь в классе сервлета, его обычно можно просто ввести через @Inject .


3. Поместите его в файловую систему локального диска

, чтобы вы могли загрузить его обычным java.io путь с абсолютным путем к файловой системе на локальном диске:

InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...

Обратите внимание на важность использования абсолютного пути. Относительные пути к файловой системе на локальном диске абсолютно недопустимы в веб-приложении Java EE. См. Также первую ссылку «См. Также» ниже.


Что выбрать?

Просто взвесьте преимущества / недостатки вашего собственного мнения о ремонтопригодности.

Если файлы свойств являются "статическими" и никогда не должны изменяться во время выполнения, вы можете сохранить их в WAR.

Если вы предпочитаете иметь возможность редактировать файлы свойств вне веб-приложения без необходимости каждый раз перестраивать и повторно развертывать WAR, то поместите его в путь к классам вне проекта (при необходимости добавьте каталог в путь к классам).

Если вы предпочитаете иметь возможность редактировать файлы свойств программно изнутри веб-приложения, используя метод Properties # store () , поместите его вне веб-приложения. Поскольку для Properties # store () требуется Writer , вы не можете обходиться, используя путь к файловой системе на диске. Этот путь, в свою очередь, может быть передан веб-приложению как аргумент виртуальной машины или системное свойство. В качестве меры предосторожности никогда никогда не используйте getRealPath () . Все изменения в папке развертывания будут потеряны при повторном развертывании по той простой причине, что изменения не отражаются обратно в исходном WAR-файле.

См. Также:

455
ответ дан 23 November 2019 в 04:21
поделиться

Вы можете вам с вашей исходной папкой, поэтому всякий раз, когда вы создаете, эти файлы автоматически скопированы в каталог классов.

Вместо использования файла свойств используйте файл XML.

Если данные слишком малы, вы даже можете использовать Web.xml для доступа к свойствам.

Обратите внимание, что любой из этих подходов потребует от перезапуска сервера App для изменений.

3
ответ дан 23 November 2019 в 04:21
поделиться

Он просто должен быть в клас-спате (так же известен, как и WEB-INF/класс в .war как часть сборки).

5
ответ дан 23 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: