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中有啥方法可以读取占位符的字符串,并且把占位符替换成参数