Как переносить данные конфигурации из сервлета
Я пишу сервлет Java, который должен читать некоторые сайты
данные конфигурации; Я бы хотел, чтобы он был легкодоступным/изменяемым
со стороны системных администраторов во время развертывания. Нет разумного дефолта,
поэтому данные должны быть предоставлены администратором сайта.
Он состоит из нескольких пар строк/значений (think Properties).
Он будет читаться только один раз (во время инициализации).
Я знаю этот вопрос SO
и механизм ServletContext.getInitParameter()
, но насколько это возможно
я понимаю, они требуют, чтобы данные были связаны в
сервлет-пакет (либо как файл свойств, либо указанный в
web.xml
), что делает неудобным обновление кода сервлета.
Есть ли какой-либо "стандартный" интерфейс для сервлета, чтобы получить такой вид
данные конфигурации ключа/значения? Было бы хорошо, если бы программирование
интерфейс везде одинаковый, но фактический способ настройки
данные конфигурации зависят от используемого контейнера сервлетов.
Я предпочитаю портативные решения, но я был бы доволен
то, что работает только в Tomcat и Jetty.
Ответы
Ответ 1
Рекомендуемый способ настройки сервера приложений для веб-приложения - для JNDI.
Каждый сервер приложений (включая Jetty и Tomcat) позволяет вам настроить параметры JNDI.
Для Jetty вы можете добавить следующее к вашему jetty.xml, чтобы добавить параметр JNDI param.file
:
<!-- JNDI java:comp/env -->
<New id="param.file" class="org.mortbay.jetty.plus.naming.EnvEntry">
<Arg>param.file</Arg>
<Arg type="java.lang.String"><SystemProperty name="jetty.home" default="."/>etc/config.properties</Arg>
<Arg type="boolean">true</Arg>
</New>
Затем в вашем сервлете вы можете прочитать параметр JNDI:
import javax.naming.InitialContext;
import javax.naming.NamingException;
...
public Object readJndi(String paramName) {
Object jndiValue = null;
try {
final InitialContext ic = new InitialContext();
jndiValue = ic.lookup("java:comp/env/" + paramName);
} catch (NamingException e) {
// handle exception
}
return jndiValue;
}
public String getConfigPath() {
return (String) readJndi("param.file");
}
Способ установки значений JNDI отличается для других серверов приложений, но код для чтения конфигурации всегда один и тот же.
Ответ 2
Параметры Servlet init - это правильный (и стандартизованный) способ определения свойств, которые могут быть настроены администратором. Многие серверы приложений предоставляют базовый интерфейс GUI, где параметры могут быть настроены.
В качестве примера для Tomcat см. Определение параметров контекста сервлетов Tomcat
Ответ 3
-
Настройте внешнее расположение свойств - либо с помощью аргумента jvm (при запуске контейнера сервлета), либо в файле web.xml
-
во внешнем месте используйте config.properties
и прочитайте его с помощью java.util.Properties
Ответ 4
Вы можете использовать Preferences или взломать user.home, user.dir и т.д. Но для нескольких ключей/значений все упрощается.
Напишите небольшой Singleton, чтобы обернуть свойства и загрузить их из исправления и абсолютного местоположения
public class LocalConfig extends Properties {
public static LocalConfig $ = new LocalConfig();
private LocalConfig() throws IOException {
load(new File("/etc/myconfig.properties"));
}
}