Как переносить чтение данных конфигурации из сервлета
Я пишу сервлет 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"));
}
}