JSP/ сервлет читать параметры из файла свойств?
На моих страницах JSP должна отображаться различная информация в зависимости от среды, в которой они находятся (dev, production, sandbox и т. Д.). Я хочу иметь файл свойств для каждой из этих сред, который содержит все параметры, которые могут им понадобиться. Как я могу ссылаться на свойства из этого файла на странице JSP?
Мои мысли:
- Пусть сервлет передает свойства в виде объекта модели на все страницы JSP, чтобы я мог ссылаться на них как ${properties.propertyName}
- Каким-то образом ссылаться на этот файл свойств в web.xml, тогда, может быть, я называю что-то вроде ${context.properties.propertyName}?
- Вместо файла свойств, перечислите параметры в web.xml и ссылайтесь на параметры на страницах JSP. Не знаю, как это сделать, но я бы предпочел более простой файл свойств.
ОБНОВЛЕНИЕ - я должен был упомянуть, что я использую Spring 3.0 и Spring webmvc. Так что, если есть какой-то лучший способ сделать это с помощью Spring, это идеально!
4 ответа
Вы можете загрузить свойства, используя
java.util.Properties
(или общая конфигурация) вServletContextListener
"scontextInitialized(..)
метод.зарегистрировать слушателя в
<listener>
в web.xmlЗатем вы храните
Properties
вServletContext
(вы можете получить его с мероприятия) (ctx.setAttribute("properties", properties)
затем получить доступ к свойствам с помощью
${applicationScope.properties.propName}
(как отметил BalusC,applicationScope
необязательно)
Обновить:
Изначально я думал, что у Spring есть для этого какое-то готовое средство, но оказывается, что это не совсем так. У вас есть два варианта:
эта статья объясняет что-то похожее на мое предложение выше, но с использованием Spring
PropertyPlaceholderConfigurer
этот ответ и этот ответ позволяют вам выставить все ваши бины, в том числе
PropertyPlaceholderConfigurer
в контексте сервлета.
- Поместите файл свойств в известное место в вашем проекте. Например: /WEB-INF/config/environment.properties.
- Создайте простой класс Java-бина, в котором есть методы получения (если хотите, методы доступа), представляющие каждое из требуемых свойств (я буду называть это классом PropertyExposer). Например: PropertyExposer.getEnvironmentName()
- В классе запуска (например, SessionContextListener или сервлете с низким значением
) загрузите свойства, создайте свой объект PropertyExposer и сохраните его в области действия сеанса (или приложения в соответствии с вашими потребностями).
После выполнения вышеизложенного ваши свойства будут доступны для ваших файлов JSP.
Если вы инициализируете с помощью SessionContextListener (это недопустимый код, но суть сделана):
SessionContextListenser.contextInitialized(ServletContextEvent event)
{
event.getServletContext().setAttribute(); // set application scope value.
}
Если вы инициализируете с помощью сервлета (при условии, что вы расширяете GenericServlet):
YourServletClass.init()
{
getServletContext().setAttribute(); // set application scope value.
}
У меня такая же проблема. Я смог решить эту проблему, открыв файл конфигурации в моем файле webmvc-config.xml с помощью Resource Bundle:
<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource" p:basenames="classpath:META-INF/spring/config" p:fallbackToSystemLocale="false"/>
Затем я смог использовать его в моих JSP с помощью тега
<spring:message code="reactor.appKey" var="reactorAppKey" />
<scrip data-app-key="${reactorAppKey}"></script>
Не вдаваясь в дискуссию о том, где находится лучшее место для хранения специфических для среды данных (подсказка: конечно, не файлы свойств), я бы придерживался основ:
Страницы JSP отображают данные; они не получают это. Если в какой-то момент позже вы в конечном итоге получите свойства не из файла свойств, а из вашего файла JSP, при условии, что ваше приложение хорошо спроектировано, оно не должно измениться.
Следовательно, первый подход, о котором вы упомянули, имеет смысл (при условии, что вы хотели бы придерживаться информации, специфичной для окружающей среды, которая читается из файлов свойств).