【问题标题】:JSP/servlet read parameters from properties file?JSP/servlet 从属性文件中读取参数?
【发布时间】:2011-04-24 14:54:17
【问题描述】:

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

我的想法是:

  • 让 servlet 以模型对象的形式将属性提供给所有 JSP 页面,这样我就可以像 ${properties.propertyName} 一样引用它们
  • 不知何故在 web.xml 中引用了这个属性文件,然后我可能会调用类似 ${context.properties.propertyName} 的东西?
  • 而不是属性文件,在 web.xml 中列出参数并在 JSP 页面中引用这些参数。不知道该怎么做,但我更喜欢更简单的属性文件。

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

【问题讨论】:

  • 春天在这里会非常方便
  • 我用的是Spring!!!这有什么帮助?

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


【解决方案1】:
  • 您可以在ServletContextListenercontextInitialized(..) 方法中使用java.util.Properties(或commons-configuration)加载属性。

  • 在 web.xml 中使用<listener> 注册监听器

  • 然后将Properties 存储到ServletContext 中(可以从事件中获取)(ctx.setAttribute("properties", properties)

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

更新:

最初我认为 spring 有一些现成的工具可以用于此目的,但事实证明并非如此。你有两个选择:

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

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

【讨论】:

  • 对于 OP 不清楚的情况:EL 中的 applicationScope 部分是可选的。
  • 您更新中的 2 个答案正是我想要的。谢谢。
【解决方案2】:

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

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

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

【讨论】:

  • 您建议将特定环境的数据存储在哪里?
  • 在花费数月时间研究所有替代方案后,我得出结论,使用资源环境条目是迄今为止最灵活的方法。您的程序永远不会随着环境变化而改变。在此处阅读有关资源环境条目以及如何使用它们的更多信息:ibm.com/developerworks/websphere/library/techarticles/… - 它与 WebSphere 相关,但 ResEnvEntries 的概念是 J2EE 标准,并且我所知道的每个应用程序服务器都支持它。
【解决方案3】:
  1. 将属性文件放在项目中的已知位置。例如:/WEB-INF/config/environment.properties。
  2. 创建一个简单的Java bean 类,它具有公开每个所需属性的getter(访问器,如果您喜欢)(我将其称为PropertyExposer 类)。例如:PropertyExposer.getEnvironmentName()
  3. 在启动类(可能是 SessionContextListener 或具有低 值的 servlet)中加载属性,创建您的 PropertyExposer 对象,并将其存储在会话(或根据您的需要的应用程序)范围内。

完成上述操作后,您的属性将可用于您的 JSP 文件。

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

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

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

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

【讨论】:

  • 如何在应用范围内存储和访问propertyExposer?我喜欢这个主意,特别是如果我可以用我的 bean 定期轮询文件。
【解决方案4】:

我遇到了同样的问题。我可以通过使用资源包在我的 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 /> 标签在我的 JSP 中使用它:

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

【讨论】:

    猜你喜欢
    • 2016-09-21
    • 2016-10-20
    • 1970-01-01
    • 2013-09-11
    • 2021-09-12
    • 2011-08-24
    • 1970-01-01
    • 2012-09-12
    • 2017-04-05
    相关资源
    最近更新 更多