【问题标题】:Dynamic Placeholder substitution in properties in javajava中属性中的动态占位符替换
【发布时间】:2011-01-13 10:05:06
【问题描述】:

我想在 java 应用程序的属性中动态替换占位符。喜欢

 WelcomeMessage=Welcome Mr. {firstName} {lastName} !!!

这些 firstName 和 LastName 变量需要动态替换。我们应该使用速度模板引擎吗?或者还有其他相同的开源框架吗?

谢谢, 马尼什

【问题讨论】:

    标签: java properties placeholder


    【解决方案1】:

    velocity 是目前最好的工具。但这取决于您要用作模板的文件类型。

    例如,如果您想使用 MS word 文档作为模板,那么您必须扩展速度类并编写自己的实现。

    【讨论】:

    • 太重,太复杂
    【解决方案2】:

    您可以使用 Java SE 的 MessageFormat 类。它可以让你完全按照你的要求去做。

    在您的情况下,假设 props 包含从您的文件中加载的所有属性,下面的代码 sn-p 必须做到这一点。

    MessageFormat.format((String) props.get("WelcomeMessage"), "First", "Last");
    

    请注意,您的属性文件应该有参数索引而不是命名参数,如下所示。

    WelcomeMessage=Welcome Mr. {0} {1} !!!
    

    【讨论】:

    • 确实如此,是的,只是莫名其妙的是,它是使用数字占位符而不是有意义的符号占位符定义的。令人惊讶的是,它的使用难度如此之大。
    • 在您发表评论时编辑了我的回复。 :)
    【解决方案3】:

    Velocity 相当陈旧且令人不快,在我看来,有更好的方法来做到这一点:

    • StringTemplate 是最简单的模板引擎,足以满足您的需求(参见语法示例 here)。
    • 如果您已经在使用 Spring 3,它的 PropertyPlaceholderHelper 类也可以做到这一点,但我不会仅仅为了掌握这一类而使用 Spring。

    【讨论】:

    • 速度并不完美。但是我认为它的工作非常好,我非常推荐它。此外,工具箱概念允许非常轻松地集成您自己的“模板逻辑”。它与一般的 Servlet(和 Struts 1.x)有很好的集成
    【解决方案4】:

    在具有 JSF 2 的 Java Web 应用程序中,其工作方式如下:

    src\main\webapp\WEB-INF\faces-config.xml

    ...
        <resource-bundle>
          <base-name>com.mycompany.resources.messages</base-name>
          <var>mytext</var>
        </resource-bundle>
    ...
    

    src\main\resources\com\mycompany\resources\messages\mytext.properties

    WelcomeMessage = Welcome Mr. {0} {1} !!!
    

    index.xhtml

    <h:outputFormat value="#{mytext.WelcomeMessage}" >          
      <f:param value="#{userSessionBean.first}" />
      <f:param value="#{userSessionBean.last}" />
    </h:outputFormat>
    

    【讨论】:

      【解决方案5】:

      其中一种方法是字符串替换:

      WelcomeMessage=Welcome Mr. ${firstName} ${lastName} !!!
      

      Map<String, String> valuesMap = new HashMap<String, String>();
      valuesMap.put("firstName", "ram");
      valuesMap.put("lastName", "Kumar");
      StrSubstitutor sub = new StrSubstitutor(valuesMap);
      String message = sub.replace(WelcomeMessage);
      

      【讨论】:

      • 这个类的最新版本是org.apache.commons.commons-text中的StringSubstitutor
      【解决方案6】:

      另一种选择是添加没有依赖关系的Apache FreeMarker,并将模板定义为:

      Welcome Mr. ${firstName} ${lastName} !!!
      

      Apache FreeMarker™ 是一个模板引擎:一个基于模板和不断变化的数据生成文本输出(HTML 网页、电子邮件、配置文件、源代码等)的 Java 库。模板是用 FreeMarker 模板语言 (FTL) 编写的,这是一种简单、专业的语言

      您可以使用StringTemplateLoader使用字符串加载模板

      您可以创建一个 StringTemplateLoader 并将每个模板添加到其中:

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 2013-11-15
        • 1970-01-01
        • 2018-04-23
        • 2018-04-28
        • 2014-05-29
        • 2015-03-27
        • 1970-01-01
        • 2020-06-12
        相关资源
        最近更新 更多