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

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

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

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

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

4 ответа

Решение

Рекомендуемый способ настройки сервера приложений для веб-приложения - в соответствии с 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 отличается для других серверов приложений, но код для чтения конфигурации всегда одинаков.

Параметры инициализации сервлета - это правильный (и стандартизированный) способ определения свойств, которые могут быть настроены администратором. Многие из серверов приложений предоставляют серверную часть GUI, где параметры могут быть настроены.

Пример использования Tomcat см. В разделе " Определение параметров контекста сервлета Tomcat".

  • Настройте внешнее расположение свойств - либо через аргумент jvm (при запуске контейнера сервлета), либо в файле web.xml.

  • во внешнем месте использования config.properties и читать это с java.util.Properties

Вы можете взять Preferences или взломать user.home, user.dir и т. Д. Но для нескольких ключей / значений оставьте вещи простыми.

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

public class LocalConfig extends Properties {

  public static LocalConfig $ = new LocalConfig();

  private LocalConfig() throws IOException {
    load(new File("/etc/myconfig.properties"));
  }

}
Другие вопросы по тегам