我正在使用春天。我有一个外部化的属性文件。我正在加载它如下。
<context:property-placeholder location="file:///C:/some.properties"/>
现在我如何将会话中的属性保存为键值对?
我尝试编写一个扩展ServletContextListener的监听器。
public class Sample implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
//here i tried to get the values of properties file as below.
InputStream stream = event.getServletContext().getResourceAsStream("C:\\some.properties");
//But here stream is coming as null
}
}
我在这里遗漏了什么吗?
谢谢!
答案 0 :(得分:2)
SetvletContext
的{{1}},
如果要将其属性文件存储在应用程序上下文中,可以将其放在
中contextInitlalized()
如果您想在每个会话中使用它,那么您需要将其挂钩到HttpSessionListener
的sessionCreated()
方法
因此,将 event.getServletContext().setAttribute("global_properties", propertiesInstance);
中经常使用且在应用程序中共享的数据与仅限会话但经常使用的数据放在applicationscope
答案 1 :(得分:1)
我建议使用与ServletContextListner通信的PropertyPlaceHolderConfigurer。此类PropertyPlaceHolderConfigurer有一个方法调用processProperties,您可以在其中获取所有属性的映射。
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
resolvedProps = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
resolvedProps.put(keyStr, parseStringValue(props.getProperty(keyStr), props,
new HashSet()));
}
}
在listner contextInitialized()中你可以这样做:
ServletContext servletContext = sce.getServletContext();
WebApplicationContext context = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
ExposablePropertyPlaceHolder configurer =(ExposablePropertyPlaceHolder)context.getBean(propertiesBeanName);
sce.getServletContext().setAttribute(contextProperty, configurer.getResolvedProps());
其中ExposablePropertyPlaceHolder是扩展PropertyPlaceHolderConfigurer的类。