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



в моем веб-приложении я должен отправить по электронной почте набор предопределенных пользователей, таких как [email protected], поэтому я хочу добавить это к .properties файл и доступ к нему при необходимости. Это правильная процедура, если да, то где я должен разместить этот файл? Я использую IDE Netbeans, которая имеет две отдельные папки для исходных и JSP-файлов.

1162   6  

6 ответов:

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


1. Положить его в classpath

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

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

здесь foo.properties должен быть помещен в один из корней, которые покрыты по умолчанию classpath веб-приложения, например webapp в /WEB-INF/lib и /WEB-INF/classes, , или . Если propertiesfile-это веб-приложение, лучше всего разместить его в /WEB-INF/classes. Если вы разрабатываете стандартный военный проект в IDE, поместите его в src папка (исходная папка проекта). Если вы используете проект Maven, поместите его в .

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

если у вас есть разместил foo.properties это в структуре пакета Java, как com.example, то вам нужно загрузить его, как показано ниже

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");
// ...

однако видимость файла свойств зависит тогда от рассматриваемого загрузчика классов. Он виден только для того же загрузчика классов, что и тот, который загрузил класс. Так, если класс загружается например, обычный загрузчик классов сервера, а не веб-приложение classloader, и файл свойств внутри себя веб-приложение, то она невидима. Загрузчик классов контекста-это ваша самая безопасная ставка, поэтому вы можете разместить файл свойств "везде" в пути к классу и/или вы собираетесь переопределить серверный файл из веб-приложения.


2. Поместите его в webcontent

, так что вы можете загрузить его по ServletContext#getResourceAsStream() с WebContent-относительный путь:

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

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


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

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

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

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


что выбрать?

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

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

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

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

Читайте также:

слово предупреждения: если вы поместите конфигурационные файлы в свой WEB-INF/classes папка, и ваша IDE, скажем Eclipse, делает чистую/перестроенную, она будет уничтожать ваши файлы conf, если они не были в исходном каталоге Java. Отличный ответ BalusC намекает на это в варианте 1, но я хотел бы добавить акцент.

я узнал, что если вы "копируете" веб-проект в Eclipse, он делает чистую/перестроенную из любых исходных папок. В моем случае я добавил "связанный исходный код dir" из нашей библиотеки POJO java, это было бы скомпилировать в . Выполнение очистки / перестроения в этом проекте (а не в проекте веб-приложения) вызвало ту же проблему.

Я думал о том, чтобы поместить мои конфы в папку POJO src, но эти конфы предназначены для сторонних библиотек (например, Quartz или URLRewrite), которые находятся в WEB-INF/lib папка, так что это не имело смысла. Я планирую протестировать его в папке "src" веб-проектов, когда я дойду до него, но эта папка в настоящее время пуста и в ней есть файлы conf неэлегантный.

поэтому я голосую за размещение файлов conf в WEB-INF/commonConfFolder/filename.properties,далее в папку classes, которая является опцией Balus 2.

например, в интернете.XML-файл тега

<context-param>
        <param-name>chatpropertyfile</param-name>
        <!--  Name of the chat properties file. It contains the name and description                   of rooms.-->     
        <param-value>chat.properties</param-value>
    </context-param>

и чат.свойства вы можете объявить свои свойства следующим образом

Например :

Jsp = Discussion about JSP can be made here.
Java = Talk about java and related technologies like J2EE.
ASP = Discuss about Active Server Pages related technologies like VBScript and JScript etc.
Web_Designing = Any discussion related to HTML, JavaScript, DHTML etc.
StartUp = Startup chat room. Chatter is added to this after he logs in.

Он просто должен быть в пути к классам (aka убедитесь, что он заканчивается в /WEB-INF/classes in .война как часть сборки).

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

вместо того, чтобы использовать файл свойств, использовать XML-файл.

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

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

предположим, что ваш код ищет файл сказать приложение.свойства. Скопировать этот файл в любую папку и добавить этот каталог в переменную окружения classpath, путем создания setenv.sh в каталог bin сервера Tomcat.

в вашем setenv.sh tomcat( если этот файл не существует, создайте его, tomcat загрузит это setenv.sh файл. #!/bin/sh CLASSPATH="$CLASSPATH:/home/user/config_my_prod/"

у вас не должно быть ваших файлов свойств ./веб-приложения/веб-инф/классов/приложение.свойства

загрузчик класса Tomcat переопределит с помощью одного из WEB-INF / classes/

хорошее чтение: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Comments

    Ничего не найдено.