【问题标题】:How to create dynamic Template String如何创建动态模板字符串
【发布时间】:2010-03-03 04:35:02
【问题描述】:

是否有任何 API 可以使用 Spring 或 java 替换模板字符串和值。

例如:

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

Map形式的where参数(FIRST_NAME,LAST_NAME)。

【问题讨论】:

  • +1 表示问题 -2 表示所选答案

标签: java spring templates


【解决方案1】:

编写执行此操作的代码相对简单。如果这是您将要做的很多事情,但是您可能想要考虑使用现有的库,例如Velocity。但是,它对值使用不同的语法。见Getting Started

如果你想自己写,试试:

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

例如:

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

输出:

Hi John Smith.

【讨论】:

    【解决方案2】:

    我最喜欢的模板引擎是Apache Velocity

    也很好地与 Spring 集成,有一篇介绍性文章here

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        用法:

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

        实施:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-21
          • 2012-07-27
          • 1970-01-01
          • 1970-01-01
          • 2015-09-10
          • 1970-01-01
          • 1970-01-01
          • 2021-06-24
          相关资源
          最近更新 更多