web-dev-qa-db-fra.com

Substitution dynamique d'espaces réservés dans les propriétés en java

Je voulais substituer de manière dynamique l’espace réservé dans les propriétés d’une application Java. Comme 

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

Ces variables firstName et LastName doivent être substituées dynamiquement. Devrions-nous utiliser le moteur de gabarit de vélocité pour le même? Ou existe-t-il d'autres frameworks opensource pour la même chose? 

Merci, Manish

21
manish

Vous pouvez utiliser la classe MessageFormat de Java SE. Cela vous permet de faire exactement ce que vous demandez.

Dans votre cas, l'extrait de code ci-dessous doit faire l'affaire, en supposant que les accessoires contiennent toutes les propriétés chargées à partir de votre fichier.

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

Notez que vos fichiers de propriétés doivent avoir un index de paramètres au lieu de paramètres nommés comme ci-dessous.

WelcomeMessage=Welcome Mr. {0} {1} !!!
46
Chandra Sekar S

La vélocité est plutôt ancienne et désagréable, à mon avis, il existe de meilleures façons de le faire:

  • StringTemplate est le moteur de gabarit le plus simple, et il convient assez à vos besoins (voir Exemples de syntaxe ici ).
  • Si vous utilisez déjà Spring 3, il possède la classe PropertyPlaceholderHelper qui peut également le faire, mais je n'utiliserais pas Spring uniquement pour obtenir cette classe.
6
skaffman

Un des moyens est le substitut de chaîne:

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

Une autre option consiste à ajouter Apache FreeMarker sans dépendance et à définir le modèle comme suit:

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

Apache FreeMarker ™ est un moteur de modèle: une bibliothèque Java permettant de générer une sortie texte (pages Web HTML, courriers électroniques, fichiers de configuration, code source, etc.) en fonction de modèles et de données modifiées. Les modèles sont écrits en langage FTL (FreeMarker Template Language), un langage simple et spécialisé.

Vous pouvez utiliser StringTemplateLoader pour charger un modèle à l'aide de String

vous pouvez créer un StringTemplateLoader et y ajouter chaque modèle:

0
user7294900

Dans une application Web Java avec JSF 2, cela fonctionne comme suit:

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\ressources\com\ma société\ressources\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>
0

la vélocité est le meilleur outil pour le moment. Mais cela dépend du type de fichier que vous souhaitez utiliser comme modèle.

Par exemple, si vous souhaitez utiliser des documents MS Word comme modèle, vous devez étendre la classe par vélocité et écrire votre propre implémentation.

0
Joseph Kulandai