2010-03-03 3 views
-3

Y a-t-il une API qui remplace la chaîne du modèle avec des valeurs utilisant Spring ou java?Comment créer une chaîne de modèles dynamique

Par exemple:

Dear %FIRST_NAME% %LAST_NAME%, 
---- remaining text----------- 

où les paramètres (FIRST_NAME, LAST_NAME) sous la forme de Map.

+0

+1 pour la question -2 pour la réponse sélectionnée – Jordie

Répondre

0

Mon moteur templating préféré est Apache Velocity

Intègre bien avec le printemps et, theres un article d'introduction here

2

Il est relativement simple d'écrire du code pour cela. Si c'est quelque chose que vous allez faire beaucoup mais vous pouvez vouloir utiliser une bibliothèque existante comme Velocity. Il utilise cependant une syntaxe différente pour les valeurs. Voir Getting Started.

Si vous voulez écrire vous-même essayer:

public static String replaceAll(String text, Map<String, String> params) { 
    return replaceAll(text, params, '%', '%'); 
} 

public static String replaceAll(String text, Map<String, String> params, 
    char leading, char trailing) { 
    String pattern = ""; 
    if (leading != 0) { 
    pattern += leading; 
    } 
    pattern += "(\\w+)"; 
    if (trailing != 0) { 
    pattern += trailing; 
    } 
    Pattern p = Pattern.compile(pattern); 
    Matcher m = p.matcher(text); 
    boolean result = m.find(); 
    if (result) { 
    StringBuffer sb = new StringBuffer(); 
    do { 
     String replacement = params.get(m.group(1)); 
     if (replacement == null) { 
     replacement = m.group(); 
     } 
     m.appendReplacement(sb, replacement); 
     result = m.find(); 
    } while (result); 
    m.appendTail(sb); 
    return sb.toString(); 
    } 
    return text; 
} 

Par exemple:

String in = "Hi %FIRST_NAME% %LAST_NAME%."; 
Map<String, String> params = new HashMap<String, String>(); 
params.put("FIRST_NAME", "John"); 
params.put("LAST_NAME", "Smith"); 
String out = replaceAll(in, params); 
System.out.println(out); 

Sortie:

Hi John Smith. 
0

Utilisation:

replaceAll(string, 
     "param1", "value 1", 
     "param12", "value 12"); 

Mise en œuvre:

public static String replaceAll(String text, Object... replacements) { 
    Assert.isTrue(replacements.length % 2 == 0, "Is not key - value pairs: " + replacements); 

    Map< String, String> longToShortNamesMap = new TreeMap<>(new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      return o1.length() == o2.length() ? o1.compareTo(o2) : o2.length() - o1.length(); 
     } 
    }); 
    for (int i = 0; i < replacements.length; i += 2) { 
     longToShortNamesMap.put(Objects.toString(replacements[i]), Objects.toString(replacements[i+1])); 
    } 
    String result = text; 
    for (String key : longToShortNamesMap.keySet()) { 
     Assert.isTrue(text.contains(key), "Can not find key in the text " + key); 
     result = result.replaceAll(key, longToShortNamesMap.get(key)); 
    } 
    return result; 
} 
Questions connexes