0

我正在使用弹簧。我有一个外部化的属性文件。我正在加载它,如下所示。

 <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


}

}

我在这里错过了什么吗?

谢谢!

4

2 回答 2

2

SetvletContext'scontextInitlalized()在应用程序成功加载时初始化 servlet 上下文时调用,

如果您想将其属性文件存储在应用程序上下文中,您可以将其放入

 event.getServletContext().setAttribute("global_properties", propertiesInstance);

如果您希望每个会话都使用它,那么您需要将其挂接到HttpSessionListener's sessionCreated()方法中

所以把经常使用和跨应用程序共享applicationscope的数据放在里面,把限制在一个会话但经常使用的数据放在里面session

于 2012-07-10T10:48:15.597 回答
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()));
  }
}

在侦听器 contextInitialized() 中,您可以这样做:

ServletContext servletContext = sce.getServletContext();
  WebApplicationContext context = WebApplicationContextUtils
          .getRequiredWebApplicationContext(servletContext);
  ExposablePropertyPlaceHolder configurer =(ExposablePropertyPlaceHolder)context.getBean(propertiesBeanName);
  sce.getServletContext().setAttribute(contextProperty, configurer.getResolvedProps());

其中 ExposablePropertyPlaceHolder 是扩展 PropertyPlaceHolderConfigurer 的类。

于 2012-07-10T12:06:26.647 回答