Как переносить чтение данных конфигурации из сервлета - PullRequest
14 голосов
/ 27 сентября 2010

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

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

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

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

Ответы [ 4 ]

18 голосов
/ 27 сентября 2010

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

4 голосов
/ 27 сентября 2010

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

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

3 голосов
/ 27 сентября 2010
  • Настройка внешнего расположения свойств - либо с помощью аргумента jvm (при запуске контейнера сервлета), либо в файле web.xml

  • во внешнем местоположении используйте config.properties и считайте его с java.util.Properties

0 голосов
/ 27 сентября 2010

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

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

public class LocalConfig extends Properties {

  public static LocalConfig $ = new LocalConfig();

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

}
...