Подтвердить что ты не робот

Как переносить данные конфигурации из сервлета

Я пишу сервлет Java, который должен читать некоторые сайты данные конфигурации; Я бы хотел, чтобы он был легкодоступным/изменяемым со стороны системных администраторов во время развертывания. Нет разумного дефолта, поэтому данные должны быть предоставлены администратором сайта.
Он состоит из нескольких пар строк/значений (think Properties). Он будет читаться только один раз (во время инициализации).

Я знаю этот вопрос SO и механизм ServletContext.getInitParameter(), но насколько это возможно я понимаю, они требуют, чтобы данные были связаны в сервлет-пакет (либо как файл свойств, либо указанный в web.xml), что делает неудобным обновление кода сервлета.

Есть ли какой-либо "стандартный" интерфейс для сервлета, чтобы получить такой вид данные конфигурации ключа/значения? Было бы хорошо, если бы программирование интерфейс везде одинаковый, но фактический способ настройки данные конфигурации зависят от используемого контейнера сервлетов.

Я предпочитаю портативные решения, но я был бы доволен то, что работает только в Tomcat и Jetty.

4b9b3361

Ответ 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"));
  }

}