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

时间:2010-02-05 07:29:01

标签: java properties placeholder

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

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

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

谢谢, 和Manish

6 个答案:

答案 0 :(得分:48)

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

在您的情况下,以下代码片段必须执行此操作,假设props包含从您的文件加载的所有属性。

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

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

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

答案 1 :(得分:6)

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

  • StringTemplate是最简单的模板引擎,足以满足您的需求(请参阅语法示例here)。
  • 如果你已经在使用Spring 3,那么它有PropertyPlaceholderHelper类也可以这样做,但我不会只使用Spring来掌握这一类。

答案 2 :(得分: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);

答案 3 :(得分:1)

另一种选择是添加Apache FreeMarker,不依赖项,并将模板定义为:

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

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

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

  

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

答案 4 :(得分:0)

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

例如,如果您想使用MS word docs作为模板,那么您必须扩展velocity classess并编写自己的实现。

答案 5 :(得分:0)

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

<强> SRC \主\ web应用\ WEB-INF \面对-config.xml中

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

<强> SRC \主\资源\ COM \ myCompany的\资源\消息\ 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>