有时候就是需要一个很简单的模板渲染功能,就是一些固定的参数,然后将参数替换掉。如邮件模板、短信模板等等,这些模板内容比较单一,文字不多,变量类型单一,同时没有上下文的约束。如果我们使用如 velocity 这类模板引擎来做这个事情,相对来说还是重了一点。其实这类功能还是比较简单的,完全可以手写。以下是我写的一个方法,欢迎指正和学习,留言全接。
public class RenderUtils {
private static final Pattern p = Pattern.compile("\\$\\{\\s*([a-zA-Z0-9_\\-]+)\\s*\\}");
public static String renderText(String templateContent, Map<String, String> params) {
if (StringUtils.isBlank(templateContent)) {
return null;
}
if (params == null || params.isEmpty()) {
return templateContent.toString();
}
StringBuffer sb = new StringBuffer();
try {
Matcher matcher = p.matcher(templateContent);
while (matcher.find()) {
int groupCount = matcher.groupCount();
if (groupCount < 1) {
continue;
}
//String group0 = matcher.group(0);
String group1 = matcher.group(1);
String replacement;
if (params.containsKey(group1)) {
replacement = params.get(group1).toString();
} else {
replacement = "[-no value for '" + group1 + "'-]";
}
matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
} catch (Exception e) {
e.printStackTrace();
return templateContent.toString();
}
return sb.toString();
}
}
这里的功能不强大,但是够用。就是将 ${abc} 作为一个需要替换的内容,一旦参数中有 key=abc 的内容,就会将其替换。
支持 ${abc} 或者 ${ abc }, 中间允许一个或多个空格。