2010-02-05 38 views
20

我想在Java應用程序的屬性中動態替換佔位符。像動態佔位符替換java中的屬性

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

這些firstName和LastName變量需要動態替換。我們應該使用velocity模板引擎嗎?或者還有其他的開源框架嗎?

感謝, 馬尼什

回答

0

速度是目前最好的工具。但它取決於您想用作模板的文件類型。

例如,如果您想使用MS word文檔作爲模板,那麼您必須擴展velocity classess並編寫自己的實現。

+0

太沉重,太複雜 – msangel

43

您可以使用Java類的MessageFormat類。它可以讓你做到你所要求的。

在你的情況下,下面的代碼片段必須做的伎倆,假設道具包含從您的文件加載的所有屬性。

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

請注意,您的屬性文件應具有參數索引而不是命名參數,如下所示。

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

它做的,是的,但令人費解的,它的定義使用數字佔位符而不是有意義的符號。令人驚訝的是使用多少更難。 –

+0

編輯我的回覆,就像你在評論。:) –

6

速度是比較舊的和不愉快,在我看來,有更好的方法來做到這一點:

  • StringTemplate是最簡單的模板引擎,並配不上你需要什麼(見語法示例here)。
  • 如果你已經在使用Spring 3,它有PropertyPlaceholderHelper類也可以做到這一點,但我不會使用Spring來獲得這一類。
+0

速度並不完美。不過,我認爲它的工作非常好,我可以非常推薦它。進一步瞭解工具箱概念可以非常容易地整合您自己的「模板邏輯」。它與Servlets(和Struts 1.x)有很大的整合, – Markus

0

與JSF 2 Java Web應用程序,將工作如下:

的src \主\ web應用\ 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> 
1

其中一個方法是字符串substitutor:

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);