java中属性中的动态占位符替换

Posted

技术标签:

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

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

 WelcomeMessage=Welcome Mr. firstName lastName !!!

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

谢谢, 马尼什

【问题讨论】:

【参考方案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 并将每个模板添加到其中:

【讨论】:

以上是关于java中属性中的动态占位符替换的主要内容,如果未能解决你的问题,请参考以下文章

如何使用系统属性替换 Typesafe Config 文件中的占位符?

用动态数据替换占位符

Java实现JSON{参数}占位符名称替换指定的多个变量值

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

java中有啥方法可以读取占位符的字符串,并且把占位符替换成参数

spring源码解析---占位符解析替换