JSP / servlet从属性文件中读取参数?

时间:2010-10-13 00:51:16

标签: spring jsp servlets spring-mvc jsp-tags

我的JSP页面需要根据它们所处的环境(开发,生产,沙箱等)显示不同的信息。我希望每个环境都有一个属性文件,其中包含它们可能需要的所有参数。如何在JSP页面中引用此文件中的属性?

我的想法是:

  • 让servlet以模型对象的形式将属性提供给所有JSP页面,以便我可以引用它们,如$ {properties.propertyName}
  • 以某种方式在web.xml中引用此属性文件,然后我可能会调用类似$ {context.properties.propertyName}的内容吗?
  • 而不是属性文件,列出web.xml中的参数并引用JSP页面中的参数。不知道怎么做,但我更喜欢更简单的属性文件。

更新 - 我应该提到我正在使用Spring 3.0和Spring webmvc。所以如果有一些最佳实践方法可以使用Spring来做到这一点,那就太理想了!

4 个答案:

答案 0 :(得分:9)

  • 您可以使用java.util.Properties的{​​{1}}方法使用ServletContextListener(或commons-configuration)加载属性。

  • 在web.xml中使用contextInitialized(..)注册侦听器

  • 然后将<listener>存储到Properties(您可以从活动中获取)(ServletContext

  • 然后使用ctx.setAttribute("properties", properties)访问属性(正如BalusC所说,${applicationScope.properties.propName}是可选的)

更新:

最初我认为春天有一些现成的设施,但事实证明并非如此。您有两种选择:

  • this article解释了与我上面的建议相似的内容,但使用了spring applicationScope

  • this answerthis answer允许您公开所有bean,包括PropertyPlaceholderConfigurer到servlet上下文。

答案 1 :(得分:0)

不讨论哪里是存储特定环境数据的最佳位置(提示:当然不是属性文件),我会坚持基础:

JSP页面呈现数据;他们不接受它。如果在某个时候,稍后,您最终会从属性文件以外的其他位置获取属性 - 假设您的应用程序设计良好,您的JSP应该更改。

因此,您提到的第一种方法是有道理的(再次假设您希望坚持从属性文件中读取特定于环境的信息)。

答案 2 :(得分:0)

  1. 将属性文件放在项目中的已知位置。例如:/ WEB-INF/config/environment.properties。
  2. 创建一个简单的java bean类,它具有getter(如果你愿意,可以使用访问器),公开每个所需的属性(我将其称为PropertyExposer类)。例如:PropertyExposer.getEnvironmentName()
  3. 在启动类(可能是SessionContextListener或具有低&lt; load-on-startup&gt;值的servlet)中加载属性,创建PropertyExposer对象,并将其存储在会话(或根据您的需要的应用程序)范围内
  4. 完成上述操作后,您的属性将可用于您的JSP文件。

    如果使用SessionContextListener进行初始化(这不是有效代码,但重点是:)

    
    SessionContextListenser.contextInitialized(ServletContextEvent event)
    {
        event.getServletContext().setAttribute();  // set application scope value.
    }
    
    

    如果使用Servlet进行初始化(假设您扩展了GenericServlet):

    
    YourServletClass.init()
    {
        getServletContext().setAttribute(); // set application scope value.
    }
    
    

答案 3 :(得分:0)

我遇到了同样的问题。我能够通过使用资源包在我的webmvc-config.xml文件中公开配置文件来解决它:

<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource" p:basenames="classpath:META-INF/spring/config" p:fallbackToSystemLocale="false"/>

然后我可以使用&lt; spring:message /&gt;在我的JSP中使用它。 tag:

<spring:message code="reactor.appKey" var="reactorAppKey" />
<scrip data-app-key="${reactorAppKey}"></script>