25

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

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

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

谢谢,马尼什

4

6 回答 6

53

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

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

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

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

WelcomeMessage=Welcome Mr. {0} {1} !!!
于 2010-02-05T07:38:14.020 回答
6

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

  • StringTemplate是最简单的模板引擎,足以满足您的需要(请参阅此处的语法示例)。
  • 如果您已经在使用 Spring 3,它有PropertyPlaceholderHelper类也可以做到这一点,但我不会仅仅为了掌握这一类而使用 Spring。
于 2010-02-05T08:24:37.123 回答
6

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

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);
于 2017-06-13T04:58:32.033 回答
1

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

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

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

您可以使用StringTemplateLoader使用 String 加载模板

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

于 2018-09-04T11:51:41.773 回答
0

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

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

于 2010-02-05T07:34:13.200 回答
0

在具有 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} !!!

索引.xhtml

<h:outputFormat value="#{mytext.WelcomeMessage}" >          
  <f:param value="#{userSessionBean.first}" />
  <f:param value="#{userSessionBean.last}" />
</h:outputFormat>
于 2014-05-03T21:54:10.823 回答